2012-11-26 43 views
1

是否有可能發送一個字符串來執行Map並找出用戶以更簡單的方式繪製了哪些對象?我覺得像我做的實在是太多了......c#Autocad Map 3D 2012獲取用戶繪製對象

這是命令:

acad.DocumentManager.MdiActiveDocument.SendStringToExecute 
("_MPOLYGON ", false, false, true); 

截至目前,我做的是我訂閱對象附加事件,並命令然後我調用sendStringToExecute,然後從那裏檢查所有進入數據庫的新對象,並保留對用戶繪製的對象的引用。

所以第一:

HostApplicationServices.WorkingDatabase.ObjectAppended += 
new ObjectEventHandler(activeDB_ObjectAppended); 

acad.DocumentManager.MdiActiveDocument.CommandEnded += 
new CommandEventHandler(MdiActiveDocument_CommandEnded); 

儘管正在執行命令:

void activeDB_ObjectAppended(object sender, ObjectEventArgs e) 
     { 
      polyDessinIds.Add(e.DBObject.Id); 
     } 

WHILE正在執行_MPOLYGON命令的Autocad添加對象到數據庫中,所以我保留所有的參考。 Autocad在用戶繪製時向數據庫添加點和線。例如,一行的第一次和第二次點擊似乎被放入數據庫中。另外,當多邊形添加到工作分貝時,並不意味着它是最後一個。最後添加的對象也不能保證是真實的對象。

然後,當命令結束時,我查找正確的objectId,即使繪製了很多多邊形,也只有1個有效的objectId引用了繪製的一個或多個多邊形。

foreach (ObjectId obj in polyDessinIds) 
{ 
      if (obj.IsErased == false && obj.ObjectClass.Name == "AcDbMPolygon") 
      { 
      mPolygons = obj; 
      //there should be only one valid at this point 
      break; 
      } 
} 

我想知道是否有更好更可靠的方法來做到這一點?也許是當你提示選擇對象時,這會返回一個包含所有對象的選擇集。有沒有一種方法來「promptForPolygon」或類似的東西,一旦用戶已經繪製了它們就會將新對象返回給我?

回答

3

我不認爲你需要所有的代碼,嘗試玩:

ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectLast() 

這應該給你繪製或使用的最後一個實體。

一些更多的解釋在這裏:

http://72.77.202.9/index.php?topic=20267.0 

希望它能幫助。

+0

謝謝!有用!我知道必須有更好的方法。 – Enriquev