CAD VCL是一个高品质多功能且含源码的控件,它提供了几个强大的类用于为您的Delphi/C++Builder应用程序创建AutoCAD DXF, CGM, Hewlett-Packard PLT/HPGL, PDF和SVG文件。
CAD VCL的特性:
- 直接以AutoCAD DXF,Hewlett-Packard PLT/HPGL,CGM,PDF和SVG文件格式输出
- 与Borland Delphi和C++ Builder(从6到2010版本)完全兼容
- 支持Unicode
- 提供源代码
CADSoftTools——CAD VCL常见问题解答
Q1:是否能展示一个爆炸方块的代码?
A:您将在下面找到所需的示例代码:
interface
uses
..., CADImage, DXFConv, sgFunction, sgConsts;
...
implementation
{$R *.dfm}
procedure ExplodeInsert(ACADImage: TsgCADImage; AInsert: TsgDXFInsert);
var
I, J: Integer;
vBlockEnt: TsgDXFEntity;
vDXFInsert: TsgDXFInsert;
vDXFLine: TsgDXFLine;
vDXFLWPolyline: TsgDXFPolyline;
vDXFCircle: TsgDXFCircle;
vMatrix: TFMatrix;
vPoint, vScale, vExtrusion: TFPoint;
vAngle: Double;
begin
vMatrix := AInsert.GetMatrix;
// Iterate through entities in the block
for I := 0 to AInsert.Block.Count - 1 do
begin
vBlockEnt := AInsert.Block.Entities[I];
case vBlockEnt.EntType of
ceLine: // LINE entity
begin
// Create a copy of the entity which is inside the block
vDXFLine := TsgDXFLine.Create;
vDXFLine.AssignEntity(vBlockEnt);
// Multiply coordinates of the created entity by the transformation matrix
vDXFLine.Point := FPointXMat(vDXFLine.Point, vMatrix);
vDXFLine.Point1 := FPointXMat(vDXFLine.Point1, vMatrix);
ACADImage.Converter.Loads(vDXFLine);
ACADImage.CurrentLayout.AddEntity(vDXFLine);
end;
ceLWPolyline: // LWPOLYLINE entity
begin
vDXFLWPolyline := TsgDXFLWPolyline.Create;
vDXFLWPolyline.AssignEntity(vBlockEnt);
for J := 0 to vDXFLWPolyline.Count - 1 do
vDXFLWPolyline.Vertexes[J].Point := FPointXMat(vDXFLWPolyline.Vertexes[J].Point, vMatrix);
ACADImage.Converter.Loads(vDXFLWPolyline);
ACADImage.CurrentLayout.AddEntity(vDXFLWPolyline);
end;
ceCircle: // CIRCLE entity
begin
vDXFCircle := TsgDXFCircle.Create;
vDXFCircle.AssignEntity(vBlockEnt);
vDXFCircle.Point := FPointXMat(vDXFCircle.Point, vMatrix);
vDXFCircle.Radius := DistanceFVector(AffineTransformPoint(MakeFPoint(0, vDXFCircle.Radius, 0), vMatrix));
ACADImage.Converter.Loads(vDXFCircle);
ACADImage.CurrentLayout.AddEntity(vDXFCircle);
end;
ceInsert: // nested INSERT entity
begin
//ExplodeInsert(ACADImage, vSrcEnt as TsgDXFInsert);
vDXFInsert := TsgDXFInsert.Create;
vDXFInsert.AssignEntity(vBlockEnt);
ExtractMatrixParams(FMatXMat(TsgDXFInsert(vBlockEnt).GetMatrix, vMatrix), vPoint, vScale, vExtrusion, vAngle);
vDXFInsert.Point := vPoint;
vDXFInsert.Scale := vScale;
vDXFInsert.Extrusion := vExtrusion;
vDXFInsert.Angle := vAngle;
ACADImage.Converter.Loads(vDXFInsert);
ACADImage.CurrentLayout.AddEntity(vDXFInsert);
end;
end;
end;
// Delete the INSERT after exploding
ACADImage.Converter.RemoveEntity(AInsert, True);
// Recalculate the CAD image extents
ACADImage.GetExtents();
end;
Q2:关于处理包含3dsolids的Blocks时出现的问题
问:我正在尝试使用Delphi的CAD VCL导入器库创建表面模型。我正在遵循3D Demo中的代码来访问模型中的实体,但在处理包含3dsolids的Blocks时我发现了一些问题。
考虑2种不同的dxf模型,第一种是从圆柱体中减去棱镜的3dsolid结果。第二个是仅包含先前3dsolid的块。不幸的是我无法在此消息中附加模型,但您可以在此处获取它们。
第一个模型在3D演示中显示没有问题。我可以看到3dsolid使用三角形进行细分。但是,第二个模型我们简单地做了一个块3dsolid中没有显示3dsolid(空白输出),并且在代码中永远不会到达三角形网格。
到目前为止,我对块没有任何问题。通过使用Autoinsert = TRUE,块中包含的实体以某种方式直接出现在具有正确转换矩阵的实体列表中(FCADParams.ConvertMatrixCurrentInsertToWCS)。我在3dsolids上做错了什么?有没有办法创建一个包含3dsolid实体的块?
答:在AutoCAD 2010中创建的示例DXF文件:我们创建了一个平行六面体3DSolid对象,选择它并将其与指定的基点(COPYBASE命令)一起复制到剪贴板,将复制的对象粘贴为块模型空间(PASTEBLOCK命令),然后将图形保存为AutoCAD 2010 DXF文件。
CAD3D演示项目正确显示给定的DXF文件,这意味着可以显示块中的3DSolid(至少在您以上述方式创建时)。>>点击查看示例演示
提问者实际处理方法:
在Autocad中创建块然后插入它们的操作如下:
- 使用BLOCK命令 - >弹出窗口,在块中命名块并在块中选择所需的对象 (成员可以是其他块)和一个基点。
- 使用INSERT命令 - >窗口弹出,您可以在其中选择:要插入的块, 插入点的缩放和旋转,以及块的插入副本。
Q3:关于找不到MeshBuilder.dll文件的问题
问:显示* .stp文件需要MeshBuilder.dll。但我无法做到,甚至CAD3D演示都会显示TsgCommonBrepImageError异常'MeshBuilder.dll无法加载!'。怎样才能实现这一点?
答:CAD VCL需要MeshBuilder.dll和Open Cascade DLL来加载3D文件格式(STEP,IGES等)。这些库附带CAD VCL并位于以下文件夹中:
\ Delphi \ ExternalLib \ OpenCascade \ win32 \ vc9 \ bin \ - 用于x32平台的库,
\ Delphi \ ExternalLib \ OpenCascade \ win64 \ vc9 \ bin \ - 用于x64平台的库。
您可以将.dll文件从其中一个文件夹复制到包含可执行文件的文件夹(例如CAD3D.exe),或者,如果您希望它们位于其他路径,请调用sgFunction.InitDefMeshBuilderDllPath()方法来定义应用程序启动时的MeshBuilder.dll路径。在CAD3D演示项目中,此路径定义如下:
InitDefMeshBuilderDllPath(ExtractFilePath(Application.ExeName), 'Demos\3D\Bin\');
InitDefMeshBuilderDllPath()方法实际上也是这样,但也考虑了表示目标平台(x64或x32)的条件编译符号SG_CPUX64:
{$IFDEF SG_CPUX64}
cnstMeshBuilderDllPath := vExePath + 'ExternalLib\OpenCascade\win64\vc9\bin\';
{$ELSE}
cnstMeshBuilderDllPath := vExePath + 'ExternalLib\OpenCascade\win32\vc9\bin\';
{$ENDIF}
如果您为一个目标平台(例如x32)编译应用程序,则可以使用帖子中的直接分配。
Q4:关于排序实体的问题
问:我有一些TsgCADCurvePolygon实体和TsgDXFinsert实体。在具有实心填充的CurvePolygons上绘制DXFInserts,有时CurvePolygon实体是在DXFinserts上绘制的,有时反之亦然。能给出一些用于排序实体的示例代码吗?
正确时:
不正确时:
答:绘制顺序取决于模型空间块中的实体索引(名称为'* MODEL_SPACE'的块)。实体按以下顺序绘制:实体[0],实体[1],实体[2]等,这意味着具有较高索引值的实体在具有较低索引值的实体之上绘制。请尝试以下代码:
procedure SendEntitiesToBack(ACADImage: TsgCADImage; ALayerName: string; EntType: TsgCADEntities);
var
I, Count: Integer;
vModelSpaceBlock: TsgDXFBlock;
vDXFEntity: TsgDXFEntity;
begin
I := 0;
Count := 0;
vModelSpaceBlock := ACADImage.Converter.BlockByName('*MODEL_SPACE');
while I < vModelSpaceBlock.Count do
begin
vDXFEntity := vModelSpaceBlock.Entities[I];
if ((vDXFEntity.EntType = EntType) and (vDXFEntity.Layer.Name = ALayerName)) then
begin
Inc(Count);
vModelSpaceBlock.InsertEntity(Count - 1, vDXFEntity);
vModelSpaceBlock.DeleteEntity(I + 1);
end;
Inc(I);
end;
end;
要首先绘制属于“Koki_Grafiikka_Tausta”图层的实体填充实体,您应该按如下方式调用给定的例程,然后重新绘制CAD图像。
SendEntitiesToBack(vCADImage, 'Koki_Grafiikka_Tausta', ceCurvePolygon);
Q5:关于使用包含3dFaces的块保存为dwg格式时出错的问题
问:在尝试将包含带有3dFaces的块的图像导出为dwg或dxf格式时遇到了严重错误。尝试打开文件时,AutoCAD中的错误是:
从第877370行开始 读取INSERT 时遇到以下错误:
类AcDbEntity的类分隔符预期
DXF输入无效或不完整 - 绘图被丢弃。
使用代码如下:
function MakeSingleDTMFaces(pt1, pt2, pt3: TFPoint; blockName: string = 'Block'): TsgDXF3dFace;
begin
Result:= TsgDXF3dFace.Create;
Result.Point:= pt1;
Result.Point1:= pt2;
Result.Point2:= pt3;
Result.Point3:= pt3;
Result.Layer:= DwgCADImage.Converter.LayerByName(blockName);
end;
procedure Create3DIfcFace(IfcObject: TIfcObjectStruct);
var
mesh3dFace: TsgDXF3dFace;
P1: TFPoint;
I, J: Integer;
Step: Integer;
vCount: Integer;
pList: TList;
vBlock: TsgDXFBlock;
vInsert: TsgDXFInsert;
layerName: string;
bColor: TColor;
ifcName: string;
aColor: TAlphaColorRec;
R,G,B,A: Int64;
begin
pList:= TList.Create;
vBlock := TsgDXFBlock.Create;
ifcName:= MakeValidIdent(IfcObject.Name);
try
layerName:= IfcObject.IfcType + '-' + ifcName;
vBlock.Name := ifcName + '-.-' + IntToStr(IfcObject.Instance);
vBlock.Layer := DwgCADImage.Converter.LayerByName(layerName);
vBlock.Flags := 2;
// Add vertices
Step:= 0;
vCount:= Length(IfcObject.Vertices) div 2;
for I := 1 to (vCount div 3) do
begin
P1:= MakeFPoint(IfcObject.Vertices[step], IfcObject.Vertices[step + 1], IfcObject.Vertices[step + 2]);
pList.Add(P1);
step:= step + 6;
end;
try
begin
Step:= 0;
vCount:= Length(IfcObject.IndicesForFaces);
for I := 1 to (vCount div 3) do
begin
mesh3dFace:= MakeSingleDTMFaces(pList[IfcObject.IndicesForFaces[step]],
pList[IfcObject.IndicesForFaces[step + 1]],
pList[IfcObject.IndicesForFaces[step + 2]],
layerName);
if Assigned(Dwgan>
以上是CAD VCL最新或最热的问答,希望对你有所帮助。想要获取更多CAD产品FAQ,可在下方评论区留言,或进入CADSoftTools技术问答集锦 。