找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7533|回复: 25

[原创] 动态拖曳的可视化多义线offset

[复制链接]
发表于 2006-10-1 08:19:10 | 显示全部楼层 |阅读模式

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

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

×
由于对探索者中某些动态功能比较感兴趣,确不懂怎么实现
最近在theswamp向evgeniy请教了一个动态显示的问题,帖子在
http://www.theswamp.org/index.php?topic=12692.0
evgeniy在递归、多义线及动态显示方面很厉害。
在他的教导下,写出如下的一段多义线的动态显示程序,请指正。
有不少容错及控制的代码没有写上。

[pcode=lisp,true]
;; Great thanks to Evgeniy at www.theswamp.org              ;
;; Without his help, I dont know how the dynamic effect     ;
;; The following code take many from Evgeniy's code         ;
;; write by CHEN QING JUN, http://autolisper.googlepages.com;
(defun c:test1 (/ en en1 e ent1 gr d pt_res)
  (prompt "\n please select a polyline")
  (setq en (car (entsel)))
  (command "copy" en "" '(0. 0. 0.) '(0. 0. 0.))
  (setq en1 (entlast)
        e   (reverse (vl-member-if
                       (function (lambda (x)
                                   (= (car x) 39)
                                 ) ;_  lambda
                       ) ;_  function
                       (reverse (entget en1))
                     ) ;_  vl-member-if
            )
  )
  (setq ent1 (entget en))
  (while (= (car (setq gr (grread nil 5 0))) 5)
    (setq d (distance (cadr gr)
                      (vlax-curve-getClosestPointTo
                        en
                        (cadr gr)
                      ) ;_  vlax-curve-getClosestPointTo
            ) ;_  distance

    )
    (setq pt_res (myoffset en (cadr gr) d))
    (entmod_pline e pt_res)
    )
)

;;;;offset new lwpolyline and get the vertex           ;
(defun myoffset (ename pt dist / newent new res1)
  (command "offset" dist ename pt "")
  (setq new (entlast))
  (setq newent (entget new))
  (setq res1 (w_pl_lst newent))
  (entdel new)
  res1
)

;;;;entmod new polyline by vertex and bulge list      ;
(defun entmod_pline (e lst)
  (entmod (append
            e
            lst
          )
  )
)

;;;;get the vertex and bulge list of a polyline       ;
(defun w_pl_lst (ent / pt_list bulge_list x i res)
  (foreach x ent
    (if (= (car x) 10)
      (setq pt_list (append
                      (list (cdr x))
                      pt_list
                    )
      )
    )
    (if (= (car x) 42)
      (setq bulge_list (append
                         (list (cdr x))
                         bulge_list
                       )
      )
    )
  )
  (setq pt_list (reverse pt_list))
  (setq bulge_list (reverse bulge_list))
  (setq i 0)
  (repeat (length pt_list)
    (setq res (append
                res
                (list (cons 10 (nth i pt_list)))
                (list (cons 42 (nth i bulge_list)))
              )
    )
    (setq i (1+ i))
  )
  res
)
[/pcode]

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-10-1 09:31:24 | 显示全部楼层
从完善角度讲,有的Pline Offset 后会断成几段
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-1 09:59:29 | 显示全部楼层
CHEN QING JUN
楼主的英语真厉害
先说说你的英语怎么学的吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-1 20:55:37 | 显示全部楼层
很有创意,学习一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-2 09:31:23 | 显示全部楼层
动态容易做,要支持输入确定值不容易。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-10-3 09:19:31 | 显示全部楼层
最初由 雨箭风刀 发布
[B]动态容易做,要支持输入确定值不容易。。。 [/B]

不是没有可能,Grread 返回 2 的时候是键盘的 ASCII,用 vl-list->string 就可以取得字符,当一直用键盘输入时可以构造一个List,该List 只保存符合输入规则的字符,当然要进行一系列的判断测试。
简单的写了一个
[iframe h=600 w=100%]http://eachy.bokee.com/5720143.html[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-4 23:06:46 | 显示全部楼层
抽空测试了一下,snoopychen 的程序,对pline效果不错,对arc,circle异常,对spline有错误(可能是offset出来的实体不止是一个的原因)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-5 19:48:37 | 显示全部楼层
呵呵~我也来玩动态的~不是用entmod是删除后再生成的
用vla-Offset的支持所有曲线!可以输入精确偏移值.

  1. (defun c:testofst (/               dist           dist?       en
  2.                    exitwhile   grr           grr1               grr2
  3.                    key               offset           *ERROR*     deloffset
  4.                    trimlast    curve-point-inorout
  5.                   )
  6.   (setq en (vlax-ename->vla-object (car (entsel))))
  7.   (defun *ERROR* (msg)
  8.     (deloffset)
  9.     (princ msg)
  10.     (princ "=====>安全退出!........")
  11.   )
  12.   (defun deloffset ()
  13.     (if        offset
  14.       (foreach item offset (vla-Delete item))
  15.     )
  16.   )
  17.   (defun trimlast (str)
  18.     (substr str 1 (1- (strlen str)))
  19.   )
  20.   (defun curve-point-inorout (en pt / 2pi enname fun prj v)
  21.     (setq enname (vla-get-objectname en))
  22.     (setq 2pi (* 2 pi))
  23.     (setq prj (vlax-curve-getClosestPointTo en pt))
  24.     (setq v (vlax-curve-getFirstDeriv
  25.               en
  26.               (vlax-curve-getParamAtPoint en prj)
  27.             )
  28.     )
  29.     (if        (or (= enname "AcDbLine") (= enname "AcDbXline"))
  30.       (setq fun <)
  31.       (setq fun >)
  32.     )
  33.     (fun (rem (+ 2pi
  34.                  (- (angle prj pt)
  35.                     (angle '(0 0 0) v)
  36.                  )
  37.               )
  38.               2pi
  39.          )
  40.          pi
  41.     )
  42.   )
  43.   (if (not offseltxt)
  44.     (setq offseltxt "")
  45.   )
  46.   (while (not exitwhile)
  47.     (setq grr  (grread t)
  48.           grr1 (car grr)
  49.           grr2 (cadr grr)
  50.     )
  51.     (princ (strcat "\r当前输入值为:" offseltxt))
  52.     (cond
  53.       ((= grr1 2)                        ;grr1=2
  54.        (setq key (chr grr2))
  55.        (cond ((and
  56.                 (<= grr2 57)                ;num
  57.                 (>= grr2 46)
  58.                 (/= grr2 47)
  59.                 (/= (type (read (strcat offseltxt key))) 'SYM)
  60.               )
  61.               (setq offseltxt (strcat offseltxt key))
  62.               (princ (strcat "\r当前输入值为:" offseltxt))
  63.              )
  64.              ((= grr2 8)
  65.               (setq offseltxt (trimlast offseltxt))
  66.               (princ "\r                                       ")
  67.               (princ (strcat "\r当前输入值为:" offseltxt))
  68.              )
  69.              ((or (= grr2 13) (= grr2 32)) ;space or enter
  70.               (deloffset)
  71.               (setq dist (atof offseltxt))
  72.               (vla-Offset en (* dist dist?))
  73.               (setq exitwhile t)
  74.              )
  75.        )
  76.       )                                        ;grr1=2end
  77.       ((= grr1 5)                        ;muose move
  78.        (setq dist
  79.               (distance (vlax-curve-getclosestpointto en grr2 t) grr2)
  80.        )
  81.        (if (not (equal dist 1e-4))
  82.          (progn
  83.            (deloffset)
  84.            (setq dist? (if (curve-point-inorout en grr2)
  85.                          1
  86.                          -1
  87.                        )
  88.            )
  89.            (setq
  90.              offset (vlax-safearray->list
  91.                       (vlax-variant-value
  92.                         (vla-Offset en (* dist dist?))
  93.                       )
  94.                     )
  95.            )
  96.          )
  97.        )
  98.       )
  99.       ((= grr1 3)                        ;left
  100.        (setq exitwhile t)
  101.       )
  102.       (t                                ;exit
  103.        (deloffset)
  104.        (setq exitwhile t)
  105.       )
  106.     )
  107.   )
  108.   (princ)
  109. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-5 22:10:22 | 显示全部楼层
谢谢各位,初次研究动态的东西,引来了这么多的玉,感谢:)
fsxm的程序非常好
我从中学到了
1)curve-point-inorout这个判断offset方向的函数
原来也想用vla-offset函数的,不清楚怎么判断方向才用了command-offset,现在学了一招
2)改变我原来的思路,当时时间比较急,因此一直沿着evgeniy的entmod思路走了下来,导致只能动态改变多线,出去的这几天还在想着对其他类型的线也编些entmod,现在看来是走了弯路了。

谢谢eachy版主和fsxm关于同时对键盘及鼠标进行监控的cond函数

to 露水2
其实我的英语水平很一般,但是只要问问题的时候把大概的意思表达清楚,高手们都挺乐意帮助我们的

to 刀兄和eachy版主:)
原来的程序确实只是考虑多义线的,对于offset出多段多义线的确实没有考虑在内。

在fsxm的思路指引下,把原来一楼的改成如下代码,可以支持多种曲线,但是不支持键盘输入的,效率应该不如fsxm的高:p
不大懂怎么在14下用类似vlax-curve-getClosestPointTo的函数,不然的话,倒是可以在14下试试
  1. ;;test for dynamic offset
  2. ;; by QJCHEN
  3. ;;采用fsxm的思路
  4. (defun c:test1 (/ en en1 e ent1 gr d pt_res tempent)
  5.   (prompt "\n please select a polyline")
  6.   (setq en (car (entsel)))
  7.   (while (= (car (setq gr (grread nil 5 0))) 5)
  8.     (setq d (distance (cadr gr)
  9.                       (vlax-curve-getClosestPointTo
  10.                         en
  11.                         (cadr gr)
  12.                       ) ;_  vlax-curve-getClosestPointTo
  13.             ) ;_  distance

  14.     )
  15.     (myoffset en (cadr gr) d)
  16.     ;(entmod_pline e pt_res)
  17.     )
  18. )

  19. ;;;;offset new lwpolyline and get the vertex           ;
  20. (defun myoffset (ename pt dist / newent new res1)
  21.   (command "erase" tempent "")
  22.   (command "offset" dist ename pt "")
  23.   (setq new (entlast))
  24.   (setq newent (entget new))
  25.   (entdel new)
  26.   (command "offset" dist ename pt "")
  27.   (setq tempent (entlast))
  28. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-6 21:20:31 | 显示全部楼层
最近想了一下关于grread捕捉的问题~以下用到了grread捕捉自定义函数grreadosnap请于
http://www.xdcad.net/forum/showt ... 还不理想~呵呵
请各们多多指教啊~

  1. (defun c:test (/           dist               dist?           en
  2.                exitwhile   grr               grr1           grr2
  3.                key           offset      offset1           *error*
  4.                deloffset   trimlast    curve-point-inorout
  5.               )
  6.   (vl-load-com)
  7.   (setq en (vlax-ename->vla-object (car (entsel))))
  8.   (defun *error* (msg)
  9.     (deloffset)
  10.     (princ msg)
  11.     (princ "=====>安全退出!........")
  12.   )
  13.   (defun deloffset ()
  14.     (cond (offset
  15.            (foreach item offset (vla-delete item))
  16.            (setq offset nil)
  17.           )
  18.     )
  19.   )
  20.   (defun trimlast (str)
  21.     (substr str 1 (1- (strlen str)))
  22.   )
  23.   (defun curve-point-inorout (en pt / 2pi enname fun prj v)
  24.     (setq enname (vla-get-objectname en))
  25.     (setq 2pi (* 2 pi))
  26.     (setq prj (vlax-curve-getclosestpointto en pt))
  27.     (setq v (vlax-curve-getfirstderiv
  28.               en
  29.               (vlax-curve-getparamatpoint en prj)
  30.             )
  31.     )
  32.     (if        (or (= enname "AcDbLine") (= enname "AcDbXline"))
  33.       (setq fun <)
  34.       (setq fun >)
  35.     )
  36.     (fun (rem (+ 2pi
  37.                  (- (angle prj pt)
  38.                     (angle '(0 0 0) v)
  39.                  )
  40.               )
  41.               2pi
  42.          )
  43.          pi
  44.     )
  45.   )
  46.   (if (not offseltxt)
  47.     (setq offseltxt "")
  48.   )
  49.   (while (not exitwhile)
  50.     (setq grr  (grread t)
  51.           grr1 (car grr)
  52.           grr2 (cadr grr)
  53.     )
  54.     (princ (strcat "\r当前输入值为:" offseltxt))
  55.     (cond
  56.       ((= grr1 2)                        ;grr1=2
  57.        (setq key (chr grr2))
  58.        (cond ((and
  59.                 (<= grr2 57)                ;num
  60.                 (>= grr2 46)
  61.                 (/= grr2 47)
  62.                 (/= (type (read (strcat offseltxt key))) 'sym)
  63.               )
  64.               (setq offseltxt (strcat offseltxt key))
  65.               (princ (strcat "\r当前输入值为:" offseltxt))
  66.              )
  67.              ((= grr2 8)
  68.               (setq offseltxt (trimlast offseltxt))
  69.               (princ "\r                                       ")
  70.               (princ (strcat "\r当前输入值为:" offseltxt))
  71.              )
  72.              ((or (= grr2 13) (= grr2 32)) ;space or enter
  73.               (deloffset)
  74.               (setq dist (atof offseltxt))
  75.               (if (vl-catch-all-error-p
  76.                     (vl-catch-all-apply
  77.                       'vla-offset
  78.                       (list en (* dist dist?))
  79.                     )
  80.                   )
  81.                 (progn
  82.                   (princ "\r输入超过允许!")
  83.                   (setq offseltxt "")
  84.                   (princ "\n")
  85.                 )
  86.                 (setq exitwhile t)
  87.               )
  88.              )
  89.              ((= grr2 6)
  90.               (command "_+dsettings" 2)
  91.              )
  92.        )
  93.       )                                ;grr1=2end
  94.       ((= grr1 5)                        ;muose move
  95.        (setq grr2 (grreadosnap grr2))        ;如果不用捕捉请删除这行
  96.        (setq dist
  97.               (distance (vlax-curve-getclosestpointto en grr2 t) grr2)
  98.        )
  99.        (if (not (equal dist 1e-4))
  100.          (progn
  101.            (deloffset)
  102.            (setq dist? (if (curve-point-inorout en grr2)
  103.                          1
  104.                          -1
  105.                        )
  106.            )
  107.            (setq offset1 (vl-catch-all-apply
  108.                            'vla-offset
  109.                            (list en (* dist dist?))
  110.                          )
  111.            )
  112.            (if (not (vl-catch-all-error-p offset1))
  113.              (setq
  114.                offset (vlax-safearray->list
  115.                         (vlax-variant-value
  116.                           offset1
  117.                         )
  118.                       )
  119.              )
  120.            )
  121.          )
  122.        )
  123.       )
  124.       ((= grr1 3)                        ;left
  125.        (setq exitwhile t)
  126.       )
  127.       (t                                ;exit
  128.        (deloffset)
  129.        (setq exitwhile t)
  130.       )
  131.     )
  132.   )
  133.   (princ)
  134. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-5 13:44:08 | 显示全部楼层
grread一直不会用,郁闷!哪位大虾抽空讲解一下?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-5 17:05:59 | 显示全部楼层
占个位子学习。。。grread最近有一小点心得。
说白了就是获取了设备的响应
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-20 22:43 , Processed in 0.480871 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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