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:35 编辑
5使用Windows批处理BAT自动合并零散LSP文件
打开本文附带的源码压缩包,可以看到,本程序一共使用了42个函数。
包括lib文件夹中的6个自定义函数,src文件夹中的1个主程序和35个Z轴归零函数。
总代码行数大约为1000多行。
为方便维护,作者将他们分成42个文件,分开保存。
代码修改后,使用.BAT程序将他们合并成一个文件,方便一次性加载使用。
该程序可以在源码压缩包中的test文件夹找到。
BAT程序的介绍,请参考作者《使用Windows批处理管理Autolisp源码》一文。
brbright 发表于 2016-4-19 17:33
5使用Windows批处理BAT自动合并零散LSP文件
打开本文附带的源码压缩包,可以看到,本程序一共使用了42个 ...
很好→很棒!很好~很棒!!很好……很棒!!!感谢分享!我也试过通过BAT拆分lsp,合并也是可以的 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.
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 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-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分支判断代码。
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会自动更新。
全文完。
不知道算简单还是复杂! 看上去很强大,回家试试。谢谢了 内容很多,要有耐心才能研究透