【FAQ】CAD VCL热门技术问答精选合集

CAD VCL是一个高品质多功能且含源码的控件,它提供了几个强大的类用于为您的Delphi/C++Builder应用程序创建AutoCAD DXF, CGM, Hewlett-Packard PLT/HPGL, PDF和SVG文件。

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
  • 提供源代码

最新版CAD VCL免费下载试用


 

CADSoftTools——CAD VCL常见问题解答

 

Q1:是否能展示一个爆炸方块的代码/strong>

A:您将在下面找到所需的示例代码:

interfaceuses..., 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实体的块/span>

答:在AutoCAD 2010中创建的示例DXF文件:我们创建了一个平行六面体3DSolid对象,选择它并将其与指定的基点(COPYBASE命令)一起复制到剪贴板,将复制的对象粘贴为块模型空间(PASTEBLOCK命令),然后将图形保存为AutoCAD 2010 DXF文件。

CAD3D演示项目正确显示给定的DXF文件,这意味着可以显示块中的3DSolid(至少在您以上述方式创建时)。>>点击查看示例演示

提问者实际处理方法:

在Autocad中创建块然后插入它们的操作如下:

  1. 使用BLOCK命令 – >弹出窗口,在块中命名块并在块中选择所需的对象 (成员可以是其他块)和一个基点。
  2. 使用INSERT命令 – >窗口弹出,您可以在其中选择:要插入的块, 插入点的缩放和旋转,以及块的插入副本。

 

Q3:关于找不到MeshBuilder.dll文件的问题

问:显示* .stp文件需要MeshBuilder.dll。但我无法做到,甚至CAD3D演示都会显示TsgCommonBrepImageError异常’MeshBuilder.dll无法加载!’。怎样才能实现这一点/span>

答: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), 'Demos3DBin');

InitDefMeshBuilderDllPath()方法实际上也是这样,但也考虑了表示目标平台(x64或x32)的条件编译符 SG_CPUX64:

{$IFDEF SG_CPUX64}      cnstMeshBuilderDllPath := vExePath + 'ExternalLibOpenCascadewin64vc9bin';{$ELSE}      cnstMeshBuilderDllPath := vExePath + 'ExternalLibOpenCascadewin32vc9bin';{$ENDIF}

如果您为一个目标平台(例如x32)编译应用程序,则可以使用帖子中的直接分配。

 

Q4:关于排序实体的问题

问:我有一些TsgCADCurvePolygon实体和TsgDXFinsert实体。在具有实心填充的CurvePolygons上绘制DXFInserts,有时CurvePolygon实体是在DXFinserts上绘制的,有时反之亦然。能给出一些用于排序实体的示例代码吗/span>

正确时:

【FAQ】CAD VCL热门技术问答精选合集

不正确时:

【FAQ】CAD VCL热门技术问答精选合集

答:绘制顺序取决于模型空间块中的实体索引(名称为’* 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最新或最热的问答,希望对你有所帮助。如果你在使用的过程中遇到其他困扰,可在下方评论区留言,或进入资源列表查看更多教程。

标签:VCLCAD

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年3月25日
下一篇 2019年3月25日

相关推荐

发表回复

登录后才能评论