明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8592|回复: 42

[源码] Z轴归零源码说明

    [复制链接]
发表于 2016-4-19 17:28 | 显示全部楼层 |阅读模式
本帖最后由 brbright 于 2016-4-20 09:17 编辑

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

修订:4.2.2节“请注意set read的用法”改为“请注意eval 和read的用法”。

Contents
0  前言... 2
1  Z轴归零程序使用方法... 2
2 支持35种图元的Z轴归零... 3
3 源码修改... 4
3.1 改编/完善... 4
3.2 拓展... 4
4 阅读/修改主程序源码... 5
4.1 编程思路... 5
4.2  值得注意的代码段... 6
4.2.1  自动批量定义各种Z轴归零统计数量的变量... 6
4.2.2  自动调用与相应图元匹配的Z轴归零函数... 7
5  使用Windows批处理BAT自动合并零散LSP文件... 7
6   拓展支持Z轴归零的图元种类示例... 8
6.1   以构造线为例,编写一个函数... 8
6.2   修改t_z_zero_support_name_list列表... 9
6.3   合并所有.LSP文件... 9


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

没考虑三维空间的圆弧啊,法向量也没处理,块内对象也没处理。  发表于 2016-4-21 09:54
很有参考价值,不支持块内对象是硬伤。  发表于 2016-4-21 08:55

评分

参与人数 5明经币 +5 金钱 +30 收起 理由
xinxirong + 1 原来做了一半的z轴归零,准备开干了,大刀阔.
USER2128 + 1 赞一个!
donghuidong2003 + 1 + 10 很给力!,很强大。
自贡黄明儒 + 1 很给力!
lucas_3333 + 1 + 20 神马都是浮云

查看全部评分

 楼主| 发表于 2016-4-19 17:33 | 显示全部楼层
本帖最后由 brbright 于 2016-4-19 17:35 编辑

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

回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-19 05:57 | 显示全部楼层
的确是很好的学习模板。。。。
 楼主| 发表于 2016-4-19 17:28 | 显示全部楼层
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代码文件
所以,作者就花了点时间组织了一篇简短的编程说明,供感兴趣的读者参考。

1  Z轴归零程序使用方法
如果不需要修改源码,[brz]z轴归零.lsp可以直接使用,快捷键是brz.
 楼主| 发表于 2016-4-19 17:30 | 显示全部楼层
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
 楼主| 发表于 2016-4-19 17:31 | 显示全部楼层
3 源码修改
3.1 改编/完善
改编/完善某一种图元(圆、直线等),直接修改src目录中对应的函数,如br-z_zero_AcDbCircle.LSP、br-z_zero_AcDbLine.LSP等。
然后双击运行test目录中的【合编lsp(代码中有注释).bat】。
[brz]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】。
[brz]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自动调用相关的归零函数
 楼主| 发表于 2016-4-19 17:32 | 显示全部楼层
本帖最后由 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分支判断代码。
 楼主| 发表于 2016-4-19 17:34 | 显示全部楼层
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】。
[brz]z轴归零.lsp会自动更新。


全文完。
发表于 2016-4-19 18:31 来自手机 | 显示全部楼层
不知道算简单还是复杂!
发表于 2016-4-19 19:39 | 显示全部楼层
看上去很强大,回家试试。谢谢了
发表于 2016-4-19 20:06 | 显示全部楼层
内容很多,要有耐心才能研究透
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 00:37 , Processed in 0.364215 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表