在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 StringDim sysVarData As VariantDim 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 typeDim intData As IntegersysVarName = "FILEDIA"intData = 1sysVarData = intData    ' Integer dataThisDrawing.SetVariable sysVarName, sysVarData' Check the variable using GetVariablesysVarData = ThisDrawing.GetVariable(sysVarName)MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"' Set DCTCUST system variable (data type String) to "My Custom Dictionary"Dim strData As StringsysVarName = "DCTCUST"strData = "My Custom Dictionary"sysVarData = strData        ' String dataThisDrawing.SetVariable sysVarName, sysVarData' Check the variable using GetVariablesysVarData = ThisDrawing.GetVariable(sysVarName)MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"' Set CHAMFERA system variable (data type Double) to 1.5Dim dataDouble As DoublesysVarName = "CHAMFERA"dataDouble = 1.5sysVarData = dataDouble ' Double dataThisDrawing.SetVariable sysVarName, sysVarData' Check the variable using GetVariablesysVarData = 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 DoublesysVarName = "INSBASE"arrayData3D(0) = 1#: arrayData3D(1) = 1#: arrayData3D(2) = 0sysVarData = arrayData3D    ' 3D array dataThisDrawing.SetVariable sysVarName, sysVarData' Check the variable using GetVariablesysVarData = 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);

转载于:https://blog.51cto.com/bigpower/92208

Delphi连接AutoCAD_计算任意线条的长度宏的嵌套相关推荐

  1. vue+d3.js计算任意多边形面积

    效果图 代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...

  2. arcgisengine计算线要素总长度_弱电监控工程报价清单中,线材及辅材该如何计算?...

    在做方案过程中,经常遇到线材配置如:线材长度计算.线材选型.管槽选型等,根据以上问题现整理出关于线材配置方法. 一.线缆长度的估算 线缆长度估算分为有图纸和没图纸两种情况: 1.有图纸情况 在图纸上找 ...

  3. 计算任意多边形的面积(Android)

    需求 线段:算出地图上线段的实际长度 面积:算出地图上不规则多边形的实际面积 解决方案 1.线段的实际长度 直接使用高德的AMapUtils.calculateLineDistance(latLng, ...

  4. 矩阵元算法科学家谢翔: Rosetta如何连接隐私计算与AI?

    允风 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 大家好,我是谢翔,来自矩阵元.今天很高兴能够与大家分享矩阵元最近的一些研究成果.主要的方向是隐私计算,以及基于密码学的隐私开源框架-Rose ...

  5. 空间连接时计算总和_【数据技术】城市功能混合程度计算

    01混合度计算◐  1.1 概念与计算 熵:信息论中度量随机事件在某项实验中的不确定程度的概念. 计算公式: H(X)表示随机变量X的熵; Pi为X取Xi的概率 .显然 , 熵值越大 , 不肯定性越大 ...

  6. Delphi的实数计算结果中只保留2位小数

    Delphi的实数计算结果中如何只保留2位小数 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 你可以使用这样的办法:      x := Round(x * 100) / 100;      ...

  7. 顺序表循环队列:创建初始化、入队、出队、获取队列头数据、计算队列有效数据长度...

    /*     顺序表队列     初始化     入队列     出队列     取队列头数据     计算队列有效长度 */ #include <stdio.h> #include &l ...

  8. T-SQL 2 Tips: 1.计算任意两日期之间的周一到周日分别各有几个! 2.根据出生日期计算精确年龄!...

    这两个小技巧,不写不知道,一写吓一跳! 都是看似简单,实际做起来就懵,得仔细想一想,才能写对! 凡是有日期运算的程序都要细心哦! 先说第二个: 2.根据出生日期精确计算年龄!   所谓计算精确年龄就是 ...

  9. Python:用生成器的方式计算任意起止范围内质数的和。

    用生成器的方式计算任意起止范围内质数的和. (质数,又称素数,是大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除.) def judge(num):if num == 1:return ...

最新文章

  1. 大脑进化追不上社会文化:化石和脱氧核糖核酸证明人类大脑进化比社会慢
  2. 简述css布局技术的特点,div+css布局技术漫谈
  3. Redis:安装、配置、操作和简单代码实例(C语言Client端)[转]
  4. 64位Ubuntu kylin 16.04安装wine QQ
  5. 2017 年最受欢迎的 10个编程挑战网站
  6. Debian下安装搜狗拼音输入法
  7. Android 打开WIFI并快速获取WIFI的信息
  8. VMware Workstation 16.1 macOS unlocker 3.0.3
  9. WPF中直接打开网页方法总结
  10. Excel之vlookup函数的模糊匹配和精准匹配
  11. 渗透测试-内网横向MS-17010利用方法总结
  12. 一款非常便捷好用的mac办公工具:WPS Office 2020
  13. 数据分析 | 数据预处理(归一化和标准化)
  14. [渝粤教育] 泰州学院 信息技术基础 参考 资料
  15. 计算机网络中的基本器件(网卡,集线器,交换机,路由器)
  16. 摆脱五彩斑斓的黑,成为七彩程序员!
  17. Mac应用程序无法打开提示不明开发者?别着急看这里
  18. Android——一个简单的记账本APP
  19. easyexcel的使用-个人笔记
  20. 主窗口(08):【类】QMdiSubWindow [官翻]

热门文章

  1. OpenCV使用F变换进行修补
  2. OpenGL 基于PBR的specular textured 镜面纹理的实例
  3. C语言数据类型本质分析
  4. 细粒度图像分类_支付宝AI大幅提升细粒度图像分类识别精度:一眼看穿万物细微差异...
  5. flink报错:Error: Static methods in interface require -target:jvm-1.8 已解决
  6. overridePendingTransition的简介
  7. 1.进程间的关系:终端,网络设备
  8. Java与C#平台通信 WCF CXF SOAP
  9. MULE ESB简介
  10. 统计每年入职的员工个数