1

対象の を選択するのに苦労しますacadObject。メソッド経由で入力を取得しますselectionset.SelectonScreen

ここでは、フィルター条件に基づいてモデル空間からより多くのオブジェクトを取得できますが、ユーザーからのオブジェクトは 1 つだけ必要です。

ここで、以下のコードについて言及しました。

AcadSelectionSet selset= null;
selset=currDoc.selectionset.add("Selset");
short[] ftype=new short[1];
object[] fdata=new object[1];
ftype[0]=2;//for select the blockreference
fdata[0]=blkname;
selset.selectOnScreen ftype,fdata;  // Here i can select any no. of blocks according to filter value but i need only one block reference.

この問題を解決するのを手伝ってください。

4

2 に答える 2

1

これは、(Interop ライブラリの代わりに) 他の Autocad .NET ライブラリを使用して可能です。しかし幸いなことに、一方が他方を排除するわけではありません。

次の名前空間を含むライブラリを参照する必要があります。

using Autodesk.Autocad.ApplicationServices
using Autodesk.Autocad.EditorInput
using Autodesk.Autocad.DatabaseServices

(Autodesk から Object Arx ライブラリを無料でダウンロードできます):

Editorautocad からにアクセスする必要がありますDocument。あなたが示したコードでは、おそらくAcadDocumentドキュメントを扱っているでしょう。したがって、 を に変換するAcadDocumentには、次のDocumentようにします。

//These are extension methods and must be in a static class
//Will only work if Doc is saved at least once (has full name) - if document is new, the name will be 
public static Document GetAsAppServicesDoc(this IAcadDocument Doc)
    {
        return Application.DocumentManager.OfType<Document>().First(D => D.Name == Doc.FullOrNewName());
    }

 public static string FullOrNewName(this IAcadDocument Doc)
    {
        if (Doc.FullName == "")
            return Doc.Name;
        else
            return Doc.FullName;
    }

を取得したらDocumentEditor、および を取得します。GetSelection(Options, Filter)

Options には、プロパティSingleOnlySinglePickInSpace. それを設定すると、trueあなたが望むことができます。(両方を試して、どちらがうまく機能するかを確認してください)

//Seleciton options, with single selection
PromptSelectionOptions Options = new PromptSelectionOptions();
Options.SingleOnly = true;
Options.SinglePickInSpace = true;

//This is the filter for blockreferences
SelectionFilter Filter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "INSERT") });


//calls the user selection
PromptSelectionResult Selection = Document.Editor.GetSelection(Options, Filter);

if (Selection.Status == PromptStatus.OK)
{
    using (Transaction Trans = Document.Database.TransactionManager.StartTransaction())
    {
        //This line returns the selected items
       AcadBlockReference SelectedRef = (AcadBlockReference)(Trans.GetObject(Selection.Value.OfType<SelectedObject>().First().ObjectId, OpenMode.ForRead).AcadObject);
    }
}
于 2013-06-24T16:27:24.360 に答える
1

これは autocad 開発者ヘルプからの直接の引用です

http://docs.autodesk.com/ACD/2013/ENU/index.html?url=files/GUID-CBECEDCF-3B4E-4DF3-99A0-47103D10DADD.htm,topicNumber=d30e724932

AutoCAD .NET API に関するドキュメントはたくさんあります。

あなたが持っている必要があります

[assembly: CommandClass(typeof(namespace.class))]

NetLoadそれがclassLibraryの場合、.dllの後にコマンドラインからこのコマンドを呼び出すことができるようにしたい場合は、名前空間の上に.

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;

[CommandMethod("SelectObjectsOnscreen")]
public static void SelectObjectsOnscreen()
{
  // Get the current document and database
  Document acDoc = Application.DocumentManager.MdiActiveDocument;
  Database acCurDb = acDoc.Database;

  // Start a transaction
  using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  {
      // Request for objects to be selected in the drawing area
      PromptSelectionResult acSSPrompt = acDoc.Editor.GetSelection();

      // If the prompt status is OK, objects were selected
      if (acSSPrompt.Status == PromptStatus.OK)
      {
          SelectionSet acSSet = acSSPrompt.Value;

          // Step through the objects in the selection set
          foreach (SelectedObject acSSObj in acSSet)
          {
              // Check to make sure a valid SelectedObject object was returned
              if (acSSObj != null)
              {
                  // Open the selected object for write
                  Entity acEnt = acTrans.GetObject(acSSObj.ObjectId,
                                                   OpenMode.ForWrite) as Entity;

                  if (acEnt != null)
                  {
                      // Change the object's color to Green
                      acEnt.ColorIndex = 3;
                  }
              }
          }

          // Save the new object to the database
          acTrans.Commit();
      }

      // Dispose of the transaction
  }
}
于 2013-07-24T01:35:09.020 に答える