原创|使用教程|编辑:黄竹雯|2019-04-28 15:31:28.000|阅读 347 次
概述:CAD VCL是一个高品质多功能且含源码的控件,它提供了几个强大的类用于为您的Delphi/C++Builder应用程序创建AutoCAD DXF, CGM, Hewlett-Packard PLT/HPGL, PDF和SVG文件。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
CAD VCL是一个高品质多功能且含源码的控件,它提供了几个强大的类用于为您的Delphi/C++Builder应用程序创建AutoCAD DXF, CGM, Hewlett-Packard PLT/HPGL, PDF和SVG文件。
CAD VCL的特性:
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;
问:我正在尝试使用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中创建块然后插入它们的操作如下:
问:显示* .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)编译应用程序,则可以使用帖子中的直接分配。
问:我有一些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);
问:在尝试将包含带有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最新或最热的问答,希望对你有所帮助。如果你在使用的过程中遇到其他困扰,可在下方评论区留言,或进入资源列表查看更多教程。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn