(defun c:CA() (vl-load-com) (setq acadObject (vlax-get-acad-object)) (setq acadDocument (vla-get-ActiveDocument acadObject)) (setq mSpace (vla-get-ModelSpace acadDocument)) (setq area 0) (setq ss1 (ssget)) (setq sslen (sslength ss1)) (setq count 0) (while (< count sslen) (setq entname (ssname ss1 count)) (setq vlaobject (vlax-ename->vla-object entname)) (setq area (+ area (/ (vla-get-area vlaobject) 1000000))) (setq count (+ count 1)) (princ "\n") (princ (/ (vla-get-area vlaobject) 1000000)) (vlax-get-property vlaobject 'color) ) (princ "\n") (princ area) (textscr) (princ) )
时间: 2023-10-31 22:04:16 浏览: 102
这是一个用于计算AutoCAD中选择集中图形面积总和的Lisp程序。程序的执行流程如下:
1. 加载vl库,用于与AutoCAD进行交互;
2. 获取当前AutoCAD文档和模型空间对象;
3. 初始化变量area、ss1和count;
4. 使用ssget函数获取用户选择的对象集合(即选择集);
5. 获取选择集中对象的数量,并遍历选择集中的每个对象;
6. 获取当前对象的名称、vla对象和面积值,并将其加入总面积中;
7. 输出当前对象的面积值和颜色;
8. 输出总面积值;
9. 清空命令行窗口中的文本,并输出;
10. 结束程序。
这段Lisp程序的功能是计算选择集中所有图形对象的面积总和,并将每个对象的面积值和颜色输出到命令行窗口中。在执行程序前,用户需要手动选择需要计算面积的对象,并在AutoCAD命令行中输入"CA"来启动程序。程序执行后,会在命令行窗口中输出每个对象的面积值和颜色,并在计算完成后输出总面积值。
相关问题
(VL-LOAD-COM ) (DEFUN GET-MACIP222( / WMI SVR STR MAC S I ) (VL-LOAD-COM ) (setq WMI (vlax-create-object "WbemScripting.SWbemLocator" )) (setq SVR (vlax-invoke WMI 'CONNECTSERVER )) (setq STR "Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE") (setq MAC (vlax-invoke SVR 'EXECQUERY STR )) (VLAX-FOR I MAC (setq S (CONS (vlax-get I 'MACADDRESS ) S )) ) (vlax-release-object MAC ) (vlax-release-object SVR ) (vlax-release-object WMI ) (if (NULL (setq RETURN (CAR S )) ) (PROGN (if (NULL (setq RETURN (VL-REGISTRY-READ "HKEY_CURRENT_USER\\HTSQ" "MacIP" )) ) (PROGN (setq RETURN (VL-REGISTRY-WRITE "HKEY_CURRENT_USER\\HTSQ" "MacIP" (RTOS (* (GETVAR "CDATE" ) 100000000.0 ) 2 8 ) )) )) )) RETURN ) (DEFUN GET-MACIP( / I MAC RETURN S STR SVR WMI ) (VL-LOAD-COM ) (if (NULL (setq RETURN (VL-REGISTRY-READ "HKEY_CURRENT_USER\\HTSQ" "MacIP" )) ) (PROGN (setq WMI (vlax-create-object "WbemScripting.SWbemLocator" )) (setq SVR (vlax-invoke WMI 'CONNECTSERVER )) (setq STR "Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE") (setq MAC (vlax-invoke SVR 'EXECQUERY STR )) (VLAX-FOR I MAC (setq S (CONS (vlax-get I 'MACADDRESS ) S )) ) (vlax-release-object MAC ) (vlax-release-object SVR ) (vlax-release-object WMI ) (if (NULL (setq RETURN (CAR S )) ) (PROGN (setq RETURN (RTOS (* (GETVAR "CDATE" ) 100000000.0 ) 2 8 )) )) (VL-REGISTRY-WRITE "HKEY_CURRENT_USER\\HTSQ" "MacIP" RETURN ) )) RETURN ) (DEFUN TRANS_MAC( 16STR / MSG 10NUM I STR N16STR ADRESS YSU ) (DEFUN *ERROR*( MSG ) (PRINC MSG ) ) (setq 10NUM 0) (setq I 1) (setq STR "") (setq N16STR "") (setq ADRESS "") (REPEAT (STRLEN 16STR ) (if (/= ":" (setq YSU (SUBSTR 16STR I 1 )) ) (PROGN (setq N16STR (STRCAT N16STR YSU )) )) (setq I (1+ I )) ) (setq I 1) (REPEAT (/ (STRLEN N16STR ) 2 ) (setq STR2 (SUBSTR N16STR I 2 )) (setq ADRESS (STRCAT ADRESS (RTOS (16T10 STR2 ) 2 0 ) )) (setq I (+ 2 I )) ) (setq ADRESS ADRESS) ) (DEFUN MAC_CALCU( STR4 STRNOW BW / TIMES I JISUAN 16STR5 JISUAN2 ) (if (< (STRLEN STR4 ) 17 ) (PROGN (REPEAT (- 17 (STRLEN STR4 ) ) (setq STR4 (STRCAT BW STR4 )) ) )) (setq TIMES (+ (/ (STRLEN STR4 ) 3 ) 1 )) (setq I 1) (setq 16STR5 "") (REPEAT TIMES (if (AND (/= "" (setq JISUAN (SUBSTR STR4 I (+ 2 I ) )) ) (/= "" (setq JISUAN2 (SUBSTR STRNOW I (+ 2 I ) )) ) ) (PROGN (setq JISUAN (+ (ATOI JISUAN ) (ATOI JISUAN2 ) )) (setq 16STR5 (STRCAT 16STR5 (10T16 JISUAN ) )) )) (setq I (+ 3 I )) ) (setq 16STR5 16STR5) ) (DEFUN ZRJC( STRNOW BW / SQM ZM ) (setq SQM (TRANS_MAC (GET-MACIP ) )) (setq ZM (MAC_CALCU SQM STRNOW BW )) (vlax-ldata-put "CZL" "Key" ZM ) (vlax-ldata-put "CZL" "SQM" SQM ) (setq ZM nil) (PRINC ) (if (= (GETVAR "cmdecho" ) 0 ) (PROGN (SETVAR "cmdecho" 1 ) )) (PRINC ) )
这段代码是一些LISP函数,用于获取MAC地址和IP地址,并进行相关计算。以下是对每个函数的解释:
1. GET-MACIP222函数:该函数使用WMI (Windows Management Instrumentation) 获取本机的MAC地址。它首先创建一个WbemScripting.SWbemLocator对象,然后连接到WMI服务器。接下来,它构造一个查询字符串来获取启用了IP的网络适配器的配置信息,并执行查询。然后,它使用VLAX-FOR循环遍历查询结果,并将每个结果对象的MAC地址添加到列表S中。最后,它释放所使用的COM对象,并返回列表S中的第一个MAC地址。
2. GET-MACIP函数:该函数与GET-MACIP222函数类似,但它首先尝试从注册表中读取之前存储的MAC地址。如果找不到存储的MAC地址,则执行与GET-MACIP222函数相同的操作,并将获取到的MAC地址存储到注册表中。
3. TRANS_MAC函数:该函数将一个十六进制的MAC地址字符串转换为标准格式的MAC地址。它遍历输入字符串,将非冒号字符添加到新的字符串N16STR中。然后,它将N16STR分割成两个字符为一组的子字符串,并将其转换为十进制值。最后,它将所有子字符串的十进制值按顺序连接起来,形成标准格式的MAC地址。
4. MAC_CALCU函数:该函数接受两个参数STR4和STRNOW,分别表示之前获取的MAC地址和当前的MAC地址。它首先将STR4补全为17个字符的长度(补全的字符由参数BW指定)。然后,它计算STR4和STRNOW中每两个字符一组的子字符串的十进制值,并将它们相加。最后,它将相加后的结果转换为十六进制字符串。
5. ZRJC函数:该函数执行一系列操作来计算一个键(ZM)和一个值(SQM)。它首先调用GET-MACIP函数获取MAC地址,并将其转换为标准格式。然后,它调用MAC_CALCU函数计算ZM键的值。接下来,它使用VLAX-LDATA-PUT函数将ZM和SQM存储到名为"CZL"的VLAX数据存储中。最后,它将"cmdecho"变量设置为1,以确保命令行窗口显示输出。
以上就是这些函数的功能描述。如果你有任何问题,请随时提问。
(DEFUN GET-MACIP( / I MAC RETURN S STR SVR WMI ) (VL-LOAD-COM ) (if (NULL (setq RETURN (VL-REGISTRY-READ "HKEY_CURRENT_USER\\HTSQ" "MacIP" )) ) (PROGN (setq WMI (vlax-create-object "WbemScripting.SWbemLocator" )) (setq SVR (vlax-invoke WMI 'CONNECTSERVER )) (setq STR "Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE") (setq MAC (vlax-invoke SVR 'EXECQUERY STR )) (VLAX-FOR I MAC (setq S (CONS (vlax-get I 'MACADDRESS ) S )) ) (vlax-release-object MAC ) (vlax-release-object SVR ) (vlax-release-object WMI ) (if (NULL (setq RETURN (CAR S )) ) (PROGN (setq RETURN (RTOS (* (GETVAR "CDATE" ) 100000000.0 ) 2 8 )) )) (VL-REGISTRY-WRITE "HKEY_CURRENT_USER\\HTSQ" "MacIP" RETURN ) )) RETURN ) (DEFUN TRANS_MAC( 16STR / MSG 10NUM I STR N16STR ADRESS YSU ) (DEFUN *ERROR*( MSG ) (PRINC MSG ) ) (setq 10NUM 0) (setq I 1) (setq STR "") (setq N16STR "") (setq ADRESS "") (REPEAT (STRLEN 16STR ) (if (/= ":" (setq YSU (SUBSTR 16STR I 1 )) ) (PROGN (setq N16STR (STRCAT N16STR YSU )) )) (setq I (1+ I )) ) (setq I 1) (REPEAT (/ (STRLEN N16STR ) 2 ) (setq STR2 (SUBSTR N16STR I 2 )) (setq ADRESS (STRCAT ADRESS (RTOS (16T10 STR2 ) 2 0 ) )) (setq I (+ 2 I )) ) (setq ADRESS ADRESS) ) (DEFUN MAC_CALCU( STR4 STRNOW BW / TIMES I JISUAN 16STR5 JISUAN2 ) (if (< (STRLEN STR4 ) 17 ) (PROGN (REPEAT (- 17 (STRLEN STR4 ) ) (setq STR4 (STRCAT BW STR4 )) ) )) (setq TIMES (+ (/ (STRLEN STR4 ) 3 ) 1 )) (setq I 1) (setq 16STR5 "") (REPEAT TIMES (if (AND (/= "" (setq JISUAN (SUBSTR STR4 I (+ 2 I ) )) ) (/= "" (setq JISUAN2 (SUBSTR STRNOW I (+ 2 I ) )) ) ) (PROGN (setq JISUAN (+ (ATOI JISUAN ) (ATOI JISUAN2 ) )) (setq 16STR5 (STRCAT 16STR5 (10T16 JISUAN ) )) )) (setq I (+ 3 I )) ) (setq 16STR5 16STR5) ) (DEFUN ZRJC( STRNOW BW / SQM ZM ) (setq SQM (TRANS_MAC (GET-MACIP ) )) (setq ZM (MAC_CALCU SQM STRNOW BW )) (vlax-ldata-put "CZL" "Key" ZM ) (vlax-ldata-put "CZL" "SQM" SQM ) (setq ZM nil) (PRINC ) (if (= (GETVAR "cmdecho" ) 0 ) (PROGN (SETVAR "cmdecho" 1 ) )) (PRINC ) )
这段代码定义了几个LISP函数。
第一个函数是GET-MACIP,它没有输入参数。该函数的主要功能是获取计算机的MAC地址和IP地址,并将MAC地址存储到注册表中的"HKEY_CURRENT_USER\\HTSQ"键中的"MacIP"值中。如果注册表中已经存在"MacIP"值,则直接返回该值。
第二个函数是TRANS_MAC,它接受一个参数16STR,表示一个16进制的MAC地址字符串。该函数的主要功能是将16进制的MAC地址转换为标准的MAC地址格式(带有冒号分隔符)。
第三个函数是MAC_CALCU,它接受两个参数STR4和STRNOW,分别表示两个MAC地址字符串。该函数的主要功能是计算两个MAC地址的和,并将结果转换为标准的MAC地址格式。
最后一个函数是ZRJC,它接受两个参数STRNOW和BW,分别表示当前的MAC地址字符串和一个字符串。该函数的主要功能是调用GET-MACIP函数获取MAC地址,并使用MAC_CALCU函数计算得到最终的MAC地址结果。然后,将计算结果存储到LISP数据区中的"CZL"变量的"Key"和"SQM"键中。
以上就是这些函数的主要功能和流程。
阅读全文