2012-02-27 2 views
4

C# 플러그인을 통해 AutoCAD 도면에 외부 DWG를 삽입해야합니다. 삽입 된 블록의 삽입 지점과 회전을 사용자에게 "묻는"것이 필요합니다. 지금까지 필자는 항상 마우스 아래에 블록의 축소판을 제공하는 "._- insert"명령을 호출하는 lisp 함수를 사용하여 사용자가 그림을 클릭하여 삽입 포인터를 설정하고 그 지점에서 사용자가 한 번 더 클릭하여 회전을 설정합니다. 이제 다양한 CAD 환경에서 실행되는 솔루션이 필요하기 때문에 Lisp을 사용하거나 AutoCAD의 저급 API를 사용하지 않으려합니다. 내가 찾은 무엇 이 같은 것입니다 :마우스 아래에 축소판 그림이있는 CAD 삽입 블록

public static void InsertDwg(string dwgName) 
    { 
     CADAPI.ApplicationServices.Document doc = CADAPI.ApplicationServices.Application.DocumentManager.MdiActiveDocument; 
     CADDB.Database db = doc.Database; 
     CADAPI.EditorInput.Editor ed = doc.Editor; 
     CADDB.ObjectId ObjId; 
     using (CADDB.Transaction trx = db.TransactionManager.StartTransaction()) 
     { 
      CADDB.BlockTable bt = db.BlockTableId.GetObject(CADDB.OpenMode.ForRead) as CADDB.BlockTable; 
      CADDB.BlockTableRecord btrMs = bt[CADDB.BlockTableRecord.ModelSpace].GetObject(CADDB.OpenMode.ForWrite) as CADDB.BlockTableRecord; 
      using (CADDB.Database dbInsert = new CADDB.Database(false, true)) 
      { 
       dbInsert.ReadDwgFile(dwgName, CADDB.FileOpenMode.OpenForReadAndAllShare, true, string.Empty); 
       ObjId = db.Insert(Path.GetFileNameWithoutExtension(dwgName), dbInsert, true); 
      } 
      CADAPI.EditorInput.PromptPointOptions ppo = new CADAPI.EditorInput.PromptPointOptions("\nInsertion Point"); 
      CADAPI.EditorInput.PromptAngleOptions ppa = new CADAPI.EditorInput.PromptAngleOptions("\nInsert Rotation"); 
      CADAPI.EditorInput.PromptPointResult ppr; 
      ppr = ed.GetPoint(ppo); 
      CADAPI.EditorInput.PromptDoubleResult ppd = ed.GetAngle(ppa); 
      if (ppr.Status == CADAPI.EditorInput.PromptStatus.OK) 
      { 
       CADGEOM.Point3d insertPt = ppr.Value; 
       CADDB.BlockReference bref = new CADDB.BlockReference(insertPt, ObjId); 
       btrMs.AppendEntity(bref); 
       trx.AddNewlyCreatedDBObject(bref, true); 
       trx.Commit(); 
      } 
     } 
    } 

그러나 여기에서 나는 두 가지 문제가 있습니다 주요 한 마우스에서 미리보기가 없다는 것입니다. 두 번째는 삽입 지점과 회전을 모두 설정하기 위해 사용자가 2 번 대신 3 번 클릭해야한다는 것입니다.

어떤 종류의 SendCommand을 사용하지 않는 방법이 있으며이 모든 것들을 수행합니까? TIA

+0

제목에 C# 대신 태그를 사용하십시오. –

답변

1

미리보기를 허용하는 방법은 지그재그 모양입니다. 나는 너에게 세 개의 고리가있다. Using a jig to rotate an AutoCAD entity via .NET

  • Using transient graphics to simulate AutoCAD’s MOVE command using .NET
  • Jigging multiple entities with the DrawJig

    • 폴리 라인이 간단한 지그를 생성하는 예이다 -는 블록이 연장 할 수있다.

      두 번째 링크는 비슷하지만 믹스에 회전을 적용합니다. 이것은 사각형에 적용되지만 블록을 수용하도록 다시 수정할 수 있습니다.

      세 번째 링크는 AutoCAD의 일시적인 그래픽 인터페이스와 다른 방법을 설명합니다. 이 방법을 사용하려면 AutoCAD 2009 이상 버전을 사용해야합니다.

      마지막 두 개의 링크는 Through the Interface 블로그에서 제공합니다. 더 많은 예제를 찾을 수 있으며 특히 C# 코딩에 문제가있는 경우 매우 좋은 출발점입니다.

  • +0

    간단한 개요에서 문제를 해결하는 것처럼 보이지만 다른 CAD 환경 (특히 BricsCAD)에 지그 로직이 없기 때문에이 솔루션을 사용할 수 없습니다. 두 환경에 대한 고유 한 솔루션을 궁금해했지만 이제는 SendCommands를 피할 수 없다고 생각합니다. 어쨌든 당신의 제안에 감사드립니다. –

    0

    AcEdJig 클래스를 사용하는 것이 좋습니다. 미리보기를 제공합니다. 삽입 점과 회전을 수집하고 이에 따라 블록을 변환하는 코드를 작성해야합니다.

    Here은 Google 검색에서 예제 사용 코드의 첫 번째 링크입니다.

    +0

    일부 .NET 래퍼를 알고 있습니까? –