在AutoCAD裡可以通過 List 和Area指令求的樣條曲線等任意一條曲線的長度。但是要在delphi得到AutoCAD裡任意一條曲線的長度就需要編寫宏,然後再将宏嵌入到Delphi裡
這是在AutoCAD2004下調試通過的宏
Sub SecFunc()
Dim SelectionSet As AcadSelectionSet
Dim lSpLine As AcadSpline
Dim sysVarName As String
Dim sysVarData As Variant
Dim DataType As Integer
ThisDrawing.SelectionSets.Item(0).Delete
Set SelectionSet = ThisDrawing.SelectionSets.Add("New_SelectionSet")
SelectionSet.SelectOnScreen
Set lSpLine = SelectionSet.Item(0)
ThisDrawing.SetVariable "USERR1", 1.5
ThisDrawing.SendCommand "(vl-load-com)" & vbCr
Dim StrCom As String
StrCom = "(setvar " & Chr(34) & "USERR1" & Chr(34) & Chr(32) & "(vlax-curve-getdistatparam (vlax-ename->vla-object (handent " & Chr(34) & lSpLine.Handle & Chr(34) & ")) (vlax-curve-getendparam (vlax-ename->vla-object (handent " & Chr(34) & lSpLine.Handle & Chr(34) & ")))))" & vbCr
ThisDrawing.SendCommand StrCom
MsgBox StrCom
sysVarData = ThisDrawing.GetVariable("USERR1")
MsgBox sysVarData
End Sub
這是Delphi裡對該宏的嵌入式調用
function GetLengthOfObject(pHandle:THandle;pCadDoc:OleVariant):Real;
var
lTempVariant:OleVariant;
lTempVar:wideString;
begin
lTempVariant:=0;
lTempVar:='USERR1';
pCadDoc.SetVariable(lTempVar,lTempVariant);
lTempVar:='(vl-load-com)' + #13;
pCadDoc.SendCommand(lTempVar);
lTempVar:='(setvar ' + Chr(34) + 'USERR1'+Chr(34)+ Chr(32) +
'(vlax-curve-getdistatparam (vlax-ename->vla-object '+
'(handent '+ Chr(34) +IntToStr(pHandle)+ Chr(34)+')) '+
'(vlax-curve-getendparam (vlax-ename->vla-object '+
'(handent '+ Chr(34) +IntToStr(pHandle)+Chr(34) +
')))))'+#13;
Result:=pCadDoc.GetVariable('USERR1');
end;
體會:
1,宏的文法就是VB的文法。
2,宏裡面的"&"符号就是字元串的連接配接,在delphi裡面就是字元串的相加。比如
宏裡面的 "(setvar " & Chr(34) & "USERR1" & Chr(34) & Chr(32)
在delphi裡面就是"(setvar " + Chr(34) + "USERR1" + Chr(34) + Chr(32)
其中 Chr(34)是 " 符号 Chr(32)是空字元
3 宏裡面的VbCr就相當于是按了一下Enter鍵,而在delphi裡面就是#13
4 在delphi裡面嵌套宏一定要注意空格和回車。比如在宏裡面是"USERR1",在delphi裡 面也必須寫成:'USERR1',如果寫成'USERR1 ',在連接配接AutoCAD時就會出線“呼叫被拒絕”,或者是及時在delphi裡面能運作通過,你卻得不到想要的結果。
5 關于參數的傳遞 與函數的調用。
AutoCAD裡提供一個設定系統變量的函數 SetVariable 原型是:
object.SetVariable Name, Value
Object :Document
The object or objects this method applies to.
Name :String; input-only
The name of the system variable to set.
Value:Variant; input-only
The new value for the specified system variable.
Example
這個函數在AutoCAD提供的類型庫裡的原型是這樣的:
procedure SetVariable(const Name: WideString; Value: OleVariant); safecall;
理論上這樣調用是沒有問題的
SetVariable('USERR1',1.5);
但是這樣編譯能通的過去,運作的時候就會報錯“無法設定系統變量值”
如果聲明一個WideString類型的變量就可以了 如:
var
lName:WideString;
lName:='USERR1';
SetVariable(lName,1.5);