找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 829|回复: 11

[原创]:新写了一个校准Line和Pline的小程序

[复制链接]
发表于 2005-9-16 14:26:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
有时候某些图线会莫名其妙地出现极为微小的误差,导致图线倾斜情况,这往往是我们所不期望的。

解决这种问题有两个思路:
一是检查图线是否平直,再对不平直的情况作调整;
另一个是检查图线的顶点是否符合某个模数,如果不符合,就把顶点移动到最近的模数点上。

第一种思路会遇到这样的问题,即当图线不平直的时候,究竟哪个点是对的,哪个点是错的,或者全部都是错的?这个必须由用户来判断,因此就谈不上效率了。而且在误差极为微小的情况下,用户判断起来也有很大困难。

第二种思路就简单多了。毕竟绝大部分图线的确应该符合某种模数,这样就可以让程序自动去检查,修改。

程序可以处理Line和Pline两种实体类型。因为是直接读写图元的10和11组码,所以理论上也可以修改其他任何实体类型的基点位置。但我觉得那样做意义不大,所以只保留了Line和Pline。有需要者,可以自行修改程序第35行。

[php]
;FishLISP C:LCA
;校准LINE或PLINE
;2005-09-16  v1.0
;
;

(defun c:lca (/ ori_pt mysnap ent_obn ent_obl ent_ss ent_idx mod_idx)
  (princ "\nFishLISP C:LCA v1.0 Line、Pline校准。")
  (setvar "cmdecho" 0)
  (command "undo" "begin")
  ;设置原点,缺省0,0
  (setq lca:ori_pt (if lca:ori_pt lca:ori_pt '(0.0 0.0 0.0)))
  (princ
    (strcat "\n设置基准点:<"
            (rtos (car lca:ori_pt))
            ","
            (rtos (cadr lca:ori_pt))
            ","
            (rtos (caddr lca:ori_pt))
            "> "
    );strcat
  );princ
  (setq ori_pt (getpoint))
  (setq ori_pt (if ori_pt ori_pt lca:ori_pt))
  (setq lca:ori_pt ori_pt)
  ;设置校准精度,即模数,缺省10
  (setq lca:snap (if lca:snap lca:snap 10))
  (princ "\n设置校准精度:<")
  (princ lca:snap)
  (setq mysnap (getint "> "))
  (setq mysnap (if mysnap mysnap lca:snap))
  (setq lca:snap mysnap)
  ;收集图元
  (prompt "\n选择图元:")
  (setq ent_ss (ssget '((0 . "line,lwpolyline"))))
  (if ent_ss
    (progn
      (setq mod_idx 0
            ent_idx 0
      )
      (repeat (sslength ent_ss)
        (setq ent_obn (ssname ent_ss ent_idx)
              ent_obl (entget ent_obn)
        )
        ;替换图元
        (entmod
          (mapcar '(lambda (pl_itm)
                     (if (member (car pl_itm) (list 10 11))
                       (if (member (mapcar '(lambda (ptx pt0) (rem (- ptx pt0) lca:snap)) (cdr pl_itm) ori_pt)
                             (list '(0.0 0.0 0.0) '(0.0 0.0))
                           )
                           ;顶点无需修改
                           pl_itm
                           ;替换顶点
                           (progn
                             (setq mod_idx (1+ mod_idx))
                             (cons (car pl_itm)
                               (mapcar '(lambda (ptx pt0)
                                          (setq ptx (+ ptx (* lca:snap 0.5 (if (< ptx pt0) -1 1))))
                                          (- ptx (rem (- ptx pt0) lca:snap))
                                        )
                                        (cdr pl_itm) ori_pt
                               );mapcar
                             );cons
                           );progn
                       );if
                       pl_itm
                     );if
                   );lambda
                   ent_obl
          );mapcar
        );entmod ent_obl
        (entupd ent_obn)
        (setq ent_idx (1+ ent_idx))
      );repeat ent_ss
    );progn ent_ss
  );if ent_ss
  (command "undo" "end")
  (setvar "cmdecho" 1)
  (princ (strcat "\n" (rtos mod_idx 2 0) "个顶点已经校准。"))
  (princ)
)
(princ "FishLISP C:LCA")
(princ)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-17 01:09:31 | 显示全部楼层
要先加上范围判断,超出数值限制的要警告。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-17 01:46:31 | 显示全部楼层
试了,不太明白,线都四处跑,第二种思路能细说说吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-18 08:01:27 | 显示全部楼层
感觉不是很好用,有时会让本已有误差的线误差更大,x或y坐标正好相差一个模数;还有一个问题,修正之后的线段相对于其他未动的实体,位置就变掉了!
以前狂刀有一个利用原理1编写的程序,经过试用后也不完美,虽然横平竖直了,但是会产生更加不易被发现的误差

我想这个应该是非常棘手的难题,不是编程困难,而是原理本身就很难,楼主的原理1/2都不能很好的解决问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-18 14:03:01 | 显示全部楼层
横平竖直的还好,要是有倾角怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-18 20:52:10 | 显示全部楼层
最初由 lemonx 发布
[B]感觉不是很好用,有时会让本已有误差的线误差更大,x或y坐标正好相差一个模数;还有一个问题,修正之后的线段相对于其他未动的实体,位置就变掉了!
以前狂刀有一个利用原理1编写的程序,经过试用后也不完美,虽然?.. [/B]


误差更大的情况是模数设置不对。根据不同的图纸要设置不同的模数。

相对位置改变正是需要的——因为被改变的图线应该就是错误的图线,正是要改变它。

这个程序的思路可以看作是后补的SNAP模式。

顺便说说发生这种“极微小”误差的几种可能:
1。Fillet半径不为0,且值很小,如果用Fillet来修角,之后再对端点进行捕捉,就势必造成误差。
2。COPY或MOVE的时候虽然忘记开正交模式,看上去仍然很平直,因此以为是在正交模式下——但这样绝对会造成误差,也是很微小的那种情况。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-19 06:17:04 | 显示全部楼层
狂刀提的也很有道理:斜线的x、y坐标大多都不是按照模数来的,也对它进行处理吗?岂不是要把对的也改成错的了?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-19 09:15:19 | 显示全部楼层
斜线是指斜轴或坐标倾斜的情况吧。
我考虑了这个问题,但还没写进程序。
设定UCS,在程序里对顶点坐标进行转换应该就可以解决。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-19 12:30:02 | 显示全部楼层
既然用了ucs那么开始的时候要求输入基准点就没有意义,因为ucs和wcs没有必然的联系,基准点的“基准”就无法传递。
而且,还要考虑校正后,不垂直的两条线相交的问题,因为交点一般不可能是整数,即“校正”后还要延伸和在wcs下校正的线共端点。如果两条线在wcs都不水平垂直,那么情况还要混乱。
建议在“轴线”上下功夫。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-20 00:21:49 | 显示全部楼层
为什么基点没有意义呢?
对于不同轴线系统,或者不同的UCS的图线就应该用不同的“基点”啊,我觉得这是很显然的事。要不然我也不会在程序每次运行的时候都要求输入“基点”。

程序也需要用户做一次选择,明显不属于某个轴线系统的图线,用户为什么要去选它们?
根据我的认识,(建筑制图)同一图纸里面绝对不可以出现极为相近的不同轴线系统,也绝不应该出现极为微小的角度。正常情况下,用户是很容易判断图线属于哪个轴线系统。

这个程序很难做到全自动,也没必要做到全自动。哪怕是最基本的COPY或者MOVE,也是要靠用户决定编辑对象的吧。

我承认这个程序非常偏门。也许一定要多次遇到了类似的情况,才会觉得这个程序有一点用处。
但这恰恰是AutoLISP的特点,想到就写,随写随用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-20 13:26:37 | 显示全部楼层
看图说话
交角处,如何“校正”?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-21 17:52:35 | 显示全部楼层
这种情况确实不可能解决,当然不在考虑之列。
程序只能解决该解决并可解决的问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-23 18:26 , Processed in 0.405288 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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