CAD VCL是一個高品質(zhì)多功能且含源碼的控件,它提供了幾個強大的類用于為您的Delphi/C++Builder應(yīng)用程序創(chuàng)建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:您將在下面找到所需的示例代碼:
interfaceus..., CADImage, DXFConv, sgFunction, sgConsts;...implementation{$R *.dfm}procedure ExplodeInrt(ACADImage: TsgCADImage; AInrt: TsgDXFInrt);var I, J: Integer; vBlockEnt: TsgDXFEntity; vDXFInrt: TsgDXFInrt; vDXFLine: TsgDXFLine; vDXFLWPolyline: TsgDXFPolyline; vDXFCircle: TsgDXFCircle; vMatrix: TFMatrix; vPoint, vScale, vExtrusion: TFPoint; vAngle: Double;begin vMatrix := AInrt.GetMatrix; // Iterate through entities in the block for I := 0 to AInrt.Block.Count - 1 do begin vBlockEnt := AInrt.Block.Entities[I]; ca 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; ceInrt: // nested INSERT entity begin //ExplodeInrt(ACADImage, vSrcEnt as TsgDXFInrt); vDXFInrt := TsgDXFInrt.Create; vDXFInrt.AssignEntity(vBlockEnt); ExtractMatrixParams(FMatXMat(TsgDXFInrt(vBlockEnt).GetMatrix, vMatrix), vPoint, vScale, vExtrusion, vAngle); vDXFInrt.Point := vPoint; vDXFInrt.Scale := vScale; vDXFInrt.Extrusion := vExtrusion; vDXFInrt.Angle := vAngle; ACADImage.Converter.Loads(vDXFInrt); ACADImage.CurrentLayout.AddEntity(vDXFInrt); end; end; end; // Delete the INSERT after exploding ACADImage.Converter.RemoveEntity(AInrt, True); // Recalculate the CAD image extents ACADImage.GetExtents();end;
Q2:關(guān)于處理包含3dsolids的Blocks時出現(xiàn)的問題
問:我正在嘗試使用Delphi的CAD VCL導(dǎo)入器庫創(chuàng)建表面模型。我正在遵循3D Demo中的代碼來訪問模型中的實體,但在處理包含3dsolids的Blocks時我發(fā)現(xiàn)了一些問題。
考慮2種不同的dxf模型,第一種是從圓柱體中減去棱鏡的3dsolid結(jié)果。第二個是僅包含先前3dsolid的塊。不幸的是我無法在此消息中附加模型,但您可以在此處獲取它們。
第一個模型在3D演示中顯示沒有問題。我可以看到3dsolid使用三角形進行細分。但是,第二個模型我們簡單地做了一個塊3dsolid中沒有顯示3dsolid(空白輸出),并且在代碼中永遠不會到達三角形網(wǎng)格。
到目前為止,我對塊沒有任何問題。通過使用Autoinrt = TRUE,塊中包含的實體以某種方式直接出現(xiàn)在具有正確轉(zhuǎn)換矩陣的實體列表中(FCADParams.ConvertMatrixCurrentInrtToWCS)。我在3dsolids上做錯了什么?有沒有辦法創(chuàng)建一個包含3dsolid實體的塊?
答:在AutoCAD 2010中創(chuàng)建的示例DXF文件:我們創(chuàng)建了一個平行六面體3DSolid對象,選擇它并將其與指定的基點(COPYBASE命令)一起復(fù)制到剪貼板,將復(fù)制的對象粘貼為塊模型空間(PASTEBLOCK命令),然后將圖形保存為AutoCAD 2010 DXF文件。
CAD3D演示項目正確顯示給定的DXF文件,這意味著可以顯示塊中的3DSolid(至少在您以上述方式創(chuàng)建時)。>>點擊查看示例演示
提問者實際處理方法:
在Autocad中創(chuàng)建塊然后插入它們的操作如下:
使用BLOCK命令 - >彈出窗口,在塊中命名塊并在塊中選擇所需的對象 (成員可以是其他塊)和一個基點。使用INSERT命令 - >窗口彈出,您可以在其中選擇:要插入的塊, 插入點的縮放和旋轉(zhuǎn),以及塊的插入副本。Q3:關(guān)于找不到MeshBuilder.dll文件的問題
問:顯示* .stp文件需要MeshBuilder.dll。但我無法做到,甚至CAD3D演示都會顯示TsgCommonBrepImageError異常'MeshBuilder.dll無法加載!'。怎樣才能實現(xiàn)這一點?
答: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文件從其中一個文件夾復(fù)制到包含可執(zhí)行文件的文件夾(例如CAD3D.exe),或者,如果您希望它們位于其他路徑,請調(diào)用sgFunction.InitDefMeshBuilderDllPath()方法來定義應(yīng)用程序啟動時的MeshBuilder.dll路徑。在CAD3D演示項目中,此路徑定義如下:
InitDefMeshBuilderDllPath(ExtractFilePath(Application.ExeName), 'Demos3DBin');
InitDefMeshBuilderDllPath()方法實際上也是這樣,但也考慮了表示目標(biāo)平臺(x64或x32)的條件編譯符號SG_CPUX64:
{$IFDEF SG_CPUX64} cnstMeshBuilderDllPath := vExePath + 'ExternalLibOpenCascadewin64vc9in';{$ELSE} cnstMeshBuilderDllPath := vExePath + 'ExternalLibOpenCascadewin32vc9in';{$ENDIF}
如果您為一個目標(biāo)平臺(例如x32)編譯應(yīng)用程序,則可以使用帖子中的直接分配。
Q4:關(guān)于排序?qū)嶓w的問題
問:我有一些TsgCADCurvePolygon實體和TsgDXFinrt實體。在具有實心填充的CurvePolygons上繪制DXFInrts,有時CurvePolygon實體是在DXFinrts上繪制的,有時反之亦然。能給出一些用于排序?qū)嶓w的示例代碼嗎?
正確時:
不正確時:
答:繪制順序取決于模型空間塊中的實體索引(名稱為'* 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.InrtEntity(Count - 1, vDXFEntity); vModelSpaceBlock.DeleteEntity(I + 1); end; Inc(I); end;end;
要首先繪制屬于“Koki_Grafiikka_Tausta”圖層的實體填充實體,您應(yīng)該按如下方式調(diào)用給定的例程,然后重新繪制CAD圖像。
SendEntitiesToBack(vCADImage, 'Koki_Grafiikka_Tausta', ceCurvePolygon);
Q5:關(guān)于使用包含3dFaces的塊保存為dwg格式時出錯的問題
問:在嘗試將包含帶有3dFaces的塊的圖像導(dǎo)出為dwg或dxf格式時遇到了嚴(yán)重錯誤。嘗試打開文件時,AutoCAD中的錯誤是:
從第877370行開始 讀取INSERT 時遇到以下錯誤:
類AcDbEntity的類分隔符預(yù)期
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; vInrt: TsgDXFInrt; 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產(chǎn)品FAQ,可在下方評論區(qū)留言,或進入CADSoftTools技術(shù)問答集錦 。
本文發(fā)布于:2023-02-28 21:01:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1677716571100475.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:dwg trueconvert(dwg trueconvert怎么用).doc
本文 PDF 下載地址:dwg trueconvert(dwg trueconvert怎么用).pdf
| 留言與評論(共有 0 條評論) |