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;
    pCadDoc.SendCommand(lTempVar);
    Result:=pCadDoc.GetVariable('USERR1');
end;
체험:
1. 매크로의 문법은 바로 VB의 문법이다.
2. 매크로 안의'&'기호는 문자열의 연결이고델파이 안에는 문자열의 추가이다.예컨대
매크로 안의'(setvar'& Chr(34) &'USERR1'& Chr(34) & Chr(32)
델파이에서 "(setvar"+ Chr(34) + "USERR1"+ Chr(34) + Chr(32)
여기서 Chr(34)는 "기호 Chr(32)는 빈 문자입니다.
3 매크로 안의 VbCr는 리턴 버튼을 누르는 것과 같고델파이 안에서는 #13이다
4 델파이에 매크로를 끼워 넣으려면 반드시 빈칸과 리턴에 주의해야 한다.예를 들어 매크로 안에서'USERR1'이고델파이에서도'USERR1'이라고 써야 한다. 만약에'USERR1'이라고 쓰면 AutoCAD를 연결할 때'호출이 거부된다'고 나오거나 델파이에서 제때에 실행될 수 있지만 원하는 결과를 얻지 못한다.
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);

좋은 웹페이지 즐겨찾기