天天看點

Delphi連接配接AutoCAD_計算任意線條的長度宏的嵌套

在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);

繼續閱讀