在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;
pCadDoc.SendCommand(lTempVar);
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就至關因而按了一下回車鍵,而在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
Sub Example_SetVariable()
' This example sets various system variables, each of
' a different data type.
Dim sysVarName As String
Dim sysVarData As Variant
Dim DataType As Integer
' Set FILEDIA system variable (data type Integer) to 1. NOTE that
' you need to declare a variable as the data type of system variable,
' assign data to that variable and then make it variant type
Dim intData As Integer
sysVarName = "FILEDIA"
intData = 1
sysVarData = intData ' Integer data
ThisDrawing.SetVariable sysVarName, sysVarData
' Check the variable using GetVariable
sysVarData = ThisDrawing.GetVariable(sysVarName)
MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"
' Set DCTCUST system variable (data type String) to "My Custom Dictionary"
Dim strData As String
sysVarName = "DCTCUST"
strData = "My Custom Dictionary"
sysVarData = strData ' String data
ThisDrawing.SetVariable sysVarName, sysVarData
' Check the variable using GetVariable
sysVarData = ThisDrawing.GetVariable(sysVarName)
MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"
' Set CHAMFERA system variable (data type Double) to 1.5
Dim dataDouble As Double
sysVarName = "CHAMFERA"
dataDouble = 1.5
sysVarData = dataDouble ' Double data
ThisDrawing.SetVariable sysVarName, sysVarData
' Check the variable using GetVariable
sysVarData = ThisDrawing.GetVariable(sysVarName)
MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"
' Set INSBASE system variable (data type array) to (1.0,1.0,0)
Dim arrayData3D(0 To 2) As Double
sysVarName = "INSBASE"
arrayData3D(0) = 1#: arrayData3D(1) = 1#: arrayData3D(2) = 0
sysVarData = arrayData3D ' 3D array data
ThisDrawing.SetVariable sysVarName, sysVarData
' Check the variable using GetVariable
sysVarData = ThisDrawing.GetVariable(sysVarName)
MsgBox sysVarName & " = " & sysVarData(0) & ", " & sysVarData(1) & ", " & sysVarData(2), , "SetVariable Example"
End Sub
這個函數在AutoCAD提供的類型庫裏的原型是這樣的:
procedure SetVariable(const Name: WideString; Value: OleVariant); safecall;
理論上這樣調用是沒有問題的
SetVariable('USERR1',1.5);
可是這樣編譯能通的過去,運行的時候就會報錯「沒法設置系統變量值」
若是聲明一個WideString類型的變量就能夠了 如:
var
lName:WideString;
lName:='USERR1';
SetVariable(lName,1.5);