2015-04-02 1713 views
2

我試圖標記我的繪圖,然後以編程方式插入一個塊,以便我可以以編程方式撤消該操作,因爲它只是由於出現錯誤而部分完成。眼下是插入方法是這樣的正確使用AutoCAD API的Document.SendStringToExecute方法

public void askForInsertionPoint 
{ 
StateManagementExtensions.MarkPosition(); 
try 
{ 
    PromptPointResult pr = ed.GetPoint("\nSelect insertion point: "); 
    Point3d insPt = pr.Value; 
} 
catch(Exception e) 
{ 
//TODO handle exception with undo 
} 
} 

MarkPosition被定義爲

public static void MarkPosition() 
{ 
doc.SendStringToExecute("MARKPOS ", true, false, true); 
} 

最後,發送MARKPOS到命令行正如我在上面做調用此方法

[CommandMethod("MARKPOS")] 
public void MarkPosition() 
{ 
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; 
ed.Command("UNDO", "M"); 
} 

的pointprompt以某種方式擊敗了對AutoCAD命令行的MARKPOS調用,因此它試圖輸入MARKPOS作爲插入點,而不是暫停C#方法等待MARKPOS作爲命令執行。在提示插入點之前,如何指示程序等待並執行MARKPOS命令?我已經嘗試過SendStringToExecute調用後的Thread.sleep(),並沒有工作。

+0

你爲什麼不直接調用'MarkPosition'? (或者可能是'ed.Command(「UNDO」,「M」);'?) – crashmstr 2015-04-02 18:57:33

+0

因爲這樣會因爲某種原因產生eInvalidInput異常 – 2015-04-02 19:39:15

+0

我現在主要使用RealDWG,但是可以使用[Transaction](http: //docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer's%20Guide/index.html?url=WS73099cc142f48755-5c83e7b1120018de8c0-3c0.htm,topicNumber=d0e54861),而不是設置撤消標記? – crashmstr 2015-04-02 19:50:09

回答

2

在交易中包裝你的功能。如果交易沒有提交,則不需要回滾任何內容。

如果您想成爲一名完美主義者,請在例程開始時存儲當前視圖位置,以便您可以在命令後重置縮放/位置。

+0

正確。使用SendStringToExecute執行的命令是異步的,直到.NET命令結束纔會被調用。這就是爲什麼首先顯示pointprompt的原因。使用該事務在代碼內處理它。 如果你想要用戶有一個撤銷選項,那麼一個快速而髒的方法是讓你自己的函數也從發送字符串開始在撤消標記後執行。 – Alain 2015-04-07 06:58:10

+0

我不能指望交易的性質,因爲我想要做多個交易和非交易方法的組合,並且如果在任何時候出現故障就將它們全部推回 – 2015-04-07 14:56:16

+1

交易的性質是相當可預測的,其中作爲sendStringtoExecute的本質不是:-)。在我看來,嵌套交易和在交易中添加「非交易方法」沒有任何問題。 – Alain 2015-04-08 06:19:00

0

呼叫內另一個命令要求第一個是透明的

[CommandMethod( 「nameHere」 CommandFlags.Transparent

但隨着SendStringToExecute是異步,您仍然有問題。 ..你可能需要使用Editor.Commad來代替。