原創|使用教程|編輯:黃竹雯|2019-04-28 15:31:28.000|閱讀 439 次
概述: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@ke049m.cn