brbright 发表于 2016-4-19 17:28:07

Z轴归零源码说明

本帖最后由 brbright 于 2016-4-20 09:17 编辑

Z轴归零源码说明根据网友反馈,补充:
1.直接选对象就可以归零。
2.整体编程思路是很简单的,功能也很简陋。就是因为简单,易复制,易修改,我才花点时间写长文的。
3.主程序在src文件夹,非常简短,还有大量注释可以参考。
4.对每一种图元归零编写特别的功能函数,是为了不同网友的需求,比如究竟要不要对面不平行的圆投影为椭圆,我的代码就不考虑,就直接处理圆心点。
5.另外,主程序真的很简单,没有技术含量的。
6.缺点是最终代码会变长,优点是可以无障碍的和其他人协作。牺牲代码长度提升合作效率。也就是说,我写了一个简陋的开发框架。

修订:4.2.2节“请注意set 和read的用法”改为“请注意eval 和read的用法”。
Contents0前言... 21Z轴归零程序使用方法... 22 支持35种图元的Z轴归零... 33 源码修改... 43.1 改编/完善... 43.2 拓展... 44 阅读/修改主程序源码... 54.1 编程思路... 54.2值得注意的代码段... 64.2.1自动批量定义各种Z轴归零统计数量的变量... 64.2.2自动调用与相应图元匹配的Z轴归零函数... 75使用Windows批处理BAT自动合并零散LSP文件... 76   拓展支持Z轴归零的图元种类示例... 86.1   以构造线为例,编写一个函数... 86.2   修改t_z_zero_support_name_list列表... 96.3   合并所有.LSP文件... 9

brbright 发表于 2016-4-19 17:33:17

本帖最后由 brbright 于 2016-4-19 17:35 编辑

5使用Windows批处理BAT自动合并零散LSP文件
打开本文附带的源码压缩包,可以看到,本程序一共使用了42个函数。
包括lib文件夹中的6个自定义函数,src文件夹中的1个主程序和35个Z轴归零函数。
总代码行数大约为1000多行。
为方便维护,作者将他们分成42个文件,分开保存。
代码修改后,使用.BAT程序将他们合并成一个文件,方便一次性加载使用。
该程序可以在源码压缩包中的test文件夹找到。
BAT程序的介绍,请参考作者《使用Windows批处理管理Autolisp源码》一文。

寒潮大冬瓜 发表于 2024-6-14 00:59:09

brbright 发表于 2016-4-19 17:33
5使用Windows批处理BAT自动合并零散LSP文件
打开本文附带的源码压缩包,可以看到,本程序一共使用了42个 ...

很好→很棒!很好~很棒!!很好……很棒!!!感谢分享!我也试过通过BAT拆分lsp,合并也是可以的

brbright 发表于 2016-4-19 17:28:55

0前言
重要的事情放在前面:
1.本程序的优点是方便维护、改编和拓展。改编源码只需要做一件事、拓展只需要做两件事,详细见下文。
2.本程序提供的Z轴归零功能,大多仅仅只是将图元的基准点、定义点等直接平移到Z=0平面。对于那些不平行于Z=0平面的图元,结果会有差异。

Z轴归零一直是作者绘制AutoCAD图纸的痛点。
网络上流传的LSP程序很多,各有各的特点,都能解决一部分问题。
然而,我还是需要一款适合自己的Z轴归零程序。
我编程时发现,这个Z轴归零对我来说是一个非常经典的编程任务,涉及了以下5个很有韵味的地方,可以算是lisp编程水平的阶段性总结。
(1)lisp的模块化编程
(2)功能函数的分LSP文件独立储存
(3)变量的批量定义
(4)函数的自动调用
(5)Windows批处理BAT自动合编LSP代码文件
所以,作者就花了点时间组织了一篇简短的编程说明,供感兴趣的读者参考。

1Z轴归零程序使用方法
如果不需要修改源码,z轴归零.lsp可以直接使用,快捷键是brz.

brbright 发表于 2016-4-19 17:30:11

2 支持35种图元的Z轴归零
序号        目标图元        CAD数据库图元名
(ObjectName)        函数名
1        2D多段线        AcDb2dPolyline        br:z_zero_AcDb2dPolyline
2        二线角度标注        AcDb2LineAngularDimension        br:z_zero_AcDb2LineAngularDimension
3        三点角度标注        AcDb3PointAngularDimension        br:z_zero_AcDb3PointAngularDimension
4        对齐标注        AcDbAlignedDimension        br:z_zero_AcDbAlignedDimension
5        圆弧        AcDbArc        br:z_zero_AcDbArc
6        圆弧标注        AcDbArcDimension        br:z_zero_AcDbArcDimension
7        属性文字        AcDbAttributeDefinition        br:z_zero_AcDbAttributeDefinition
8        块参照        AcDbBlockReference        br:z_zero_AcDbBlockReference
9        圆        AcDbCircle        br:z_zero_AcDbCircle
10        直径标注        AcDbDiametricDimension        br:z_zero_AcDbDiametricDimension
11        椭圆        AcDbEllipse        br:z_zero_AcDbEllipse
12        误差标注        AcDbFcf        br:z_zero_AcDbFcf
13        填充        AcDbHatch        br:z_zero_AcDbHatch
14        引线标注        AcDbLeader        br:z_zero_AcDbLeader
15        直线        AcDbLine        br:z_zero_AcDbLine
16        阵列块        AcDbMInsertBlock        br:z_zero_AcDbMInsertBlock
17        多行引线标注        AcDbMLeader        br:z_zero_AcDbMLeader
18        多线        AcDbMline        br:z_zero_AcDbMline
19        多行文字        AcDbMText        br:z_zero_AcDbMText
20        OLE        AcDbOle2Frame        br:z_zero_AcDbOle2Frame
21        坐标标注        AcDbOrdinateDimension        br:z_zero_AcDbOrdinateDimension
22        PDF参照        AcDbPdfReference        br:z_zero_AcDbPdfReference
23        点        AcDbPoint        br:z_zero_AcDbPoint
24        多段线        AcDbPolyline        br:z_zero_AcDbPolyline
25        半径标注        AcDbRadialDimension        br:z_zero_AcDbRadialDimension
26        半径标注(折线)        AcDbRadialDimensionLarge        br:z_zero_AcDbRadialDimensionLarge
27        图片参照        AcDbRasterImage        br:z_zero_AcDbRasterImage
28        射线        AcDbRay        br:z_zero_AcDbRay
29        线性/旋转标注        AcDbRotatedDimension        br:z_zero_AcDbRotatedDimension
30        型        AcDbShape        br:z_zero_AcDbShape
31        样条曲线        AcDbSpline        br:z_zero_AcDbSpline
32        表格        AcDbTable        br:z_zero_AcDbTable
33        单行文字        AcDbText        br:z_zero_AcDbText
34        覆盖        AcDbWipeout        br:z_zero_AcDbWipeout
35        构造线        AcDbXline        br:z_zero_AcDbXline

brbright 发表于 2016-4-19 17:31:15

3 源码修改
3.1 改编/完善
改编/完善某一种图元(圆、直线等),直接修改src目录中对应的函数,如br-z_zero_AcDbCircle.LSP、br-z_zero_AcDbLine.LSP等。
然后双击运行test目录中的【合编lsp(代码中有注释).bat】。
z轴归零.lsp会自动更新。
3.2 拓展
本程序只支持35种图元的Z轴归零,如果觉得不够用,可自行编写一个专用的函数。
函数名请以br:z_zero_为前缀,后接图元的ObjectName,函数接受一个ActiveX vla-object图元作为参数。
建议将新编的函数,新建一个独立的LSP文件,然后放入src文件夹。
然后在主程序的t_z_zero_support_name_list列表增加一个ObjectName字符串。
最后双击运行test目录中的【合编lsp(代码中有注释).bat】。
z轴归零.lsp会自动更新。

4 阅读/修改主程序源码
4.1 编程思路
作者对主程序的源码进行了大量的注释,恨不得一行代码一条注释,直接阅读也是没有问题的。
以下是编程思路
(1)选择图元构造选择集,忽略锁定图层中的图元
(2)利用自编的函数将选择集中所有的图元转化为ActiveX vla-object列表
(3)建立本程序支持Z轴归零的图元的ObjectName列表,以字符串元素储存
(4)为每一个支持归零的图元准备一个变量,用于统计成功归零的数量
(5)分选本程序支持Z轴归零和不支持的图元
(6)支持Z轴归零的图元独立存放在另一个list列表中,用于归零
(7)不支持Z轴归零的图元,将其ObjectName存放在一个list列表中,用于统计
(8)遍历支持Z轴归零的图元列表,根据ObjectName自动调用相关的归零函数

brbright 发表于 2016-4-19 17:32:10

本帖最后由 brbright 于 2016-4-20 09:23 编辑

4.2值得注意的代码段
4.2.1自动批量定义各种Z轴归零统计数量的变量
;;Z轴归零支持图元的名称列表
(setq      t_z_zero_support_name_list
         (list
         "AcDb2dPolyline"            "AcDb2LineAngularDimension"
         "AcDb3PointAngularDimension"
         "AcDbAlignedDimension"   省略其他31项…
          )
);;定义Z轴归零图元的统计数量
(foreach t_each t_z_zero_support_name_list
    (set (read (strcat "t_" t_each "_num")) 0)
)
【说明】请注意set 和read的用法,上面的代码相当于:
(setq   t_AcDb2dPolyline_num   0)
(setq   t_AcDb2LineAngularDimension_num   0)
(setq   t_AcDb3PointAngularDimension_num   0)
(setq   t_AcDbAlignedDimension_num   0)
省略其他31项…

4.2.2自动调用与相应图元匹配的Z轴归零函数
(setq   t_ObjectName    (vlax-get-property   tx_ent   "ObjectName"))
(setq   t_str_for_eval    (strcat   "(br:z_zero_" t_ObjectName " tx_ent)"))
(eval (read   t_str_for_eval))
【说明】请注意eval 和read的用法。
以tx_ent是一个圆vla-object为例,第一行代码得到t_ObjectName为"AcDbCircle"。
第二行代码得到t_str_for_eval 为”(br:z_zero_AcDbCircle   tx_ent)”
第三行代码相当于(br:z_zero_AcDbCircle   tx_ent)
因为所有图元的Z轴归零函数都是以br:z_zero_为前缀,后接ObjectName的规则命名,在这里可以达到自动判断图元类型并调用相应的归零函数的效果。
由此,可以节省一大串cond分支判断代码。

brbright 发表于 2016-4-19 17:34:05

6   [改编示例]拓展Z轴归零的图元种类
6.1   以构造线为例,编写一个函数
;;Z轴归零函数---构造线Xline
;;接受一个vla-object图元作为参数
(defun br:z_zero_AcDbXline (px_ent / t_BasePoint)
;;获取构造线Xline的基点
(setq        t_BasePoint
       ;;自编函数,Safearray->List
       (br:Safearray->List (vlax-get-property px_ent "BasePoint"))
)
;;构造线Xline的基点Z坐标归零
(vlax-put-property
    px_ent
    "BasePoint"
    ;;自编函数,List->Safearray
    (br:List->Safearray
      (list (car t_BasePoint) (cadr t_BasePoint) 0.0)
    )
)
)
新建一个包含上述代码的br-z_zero_AcDbXline.LSP文件放入src目录。

6.2   修改t_z_zero_support_name_list列表
在主程序的t_z_zero_support_name_list列表增加一个ObjectName字符串,如构造线Xline的ObjectName为"AcDbXline".
;;Z轴归零支持图元的名称列表
(setq        t_z_zero_support_name_list
       (list
          省略31项…
           "AcDbTable"                  "AcDbText"
           "AcDbWipeout"          "AcDbXline"
          )
)

6.3   合并所有.LSP文件
双击运行test目录中的【合编lsp(代码中有注释).bat】。
z轴归零.lsp会自动更新。


全文完。

ivde 发表于 2016-4-19 18:31:52

不知道算简单还是复杂!

yaokui25 发表于 2016-4-19 19:39:13

看上去很强大,回家试试。谢谢了

USER2128 发表于 2016-4-19 20:06:45

内容很多,要有耐心才能研究透
页: [1] 2 3 4 5
查看完整版本: Z轴归零源码说明