找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4252|回复: 21

[他山之石] 动态插入箭头

[复制链接]
发表于 2013-4-15 11:03:20 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 adolfken 于 2013-4-15 12:20 编辑

平常因为工作的关系经常要插入一些箭头,根据鼠标的位置变化方向和变化.之前有人写过这个功能,我就按照样例仿写了一下,可能因为水平的关系算法有些复杂,还希望大家轻拍,麻烦各位大侠帮忙把算法优化一下,刚写完没有完全测试可能有点小问题.
[pcode=lisp,true](defun c:tt ()
   (vl-load-com)
   (setq acad (vlax-get-acad-object))
   (setq acaddocument (vla-get-activedocument acad))
   (setq mspace (vla-get-modelspace acaddocument))
   (setq h (getreal "\n请输入偏移距离"))
(setq endata (entsel "\n请选择一条线"))
   (setq ename (car endata))
   (setq p0 (cadr endata))
   (setq obj (vlax-ename->vla-object ename))
   (setq l1 (car (vlax-safearray->list (vlax-variant-value (vla-offset obj h)))))           ;;偏移曲线1
   (setq l2 (car (vlax-safearray->list (vlax-variant-value (vla-offset obj (* -1 h))))))    ;;偏移曲线2
   (setq p1 (vlax-curve-getclosestpointto l1 p0 t))      ;;插入点1
   (setq p2 (vlax-curve-getclosestpointto l2 p0 t))      ;;插入点2
   (vla-delete l1)    ;;删除曲线1
   (vla-delete l2)    ;;删除曲线2
   (setq ang1 (angle p2 p1))  ;;插入点1 点2角度
   (setq ang2 (- ang1 (/ pi 2)))  ;;计算直线角度或者曲线的切线角度
   (setq obj (vla-insertblock mspace (vlax-3d-point p2) "11005" 1 1 1 ang2)) ;;插入块名为11005的图块
   (setq loop t)
  (while loop
    (setq code (grread t 8))
    (cond
     ((= (car code) 5)
    (setq ang3 (- (angle p0 (cadr code)) ang2))     ;;光标所在点与单选点的角度减去直线的或者曲线切线的角度
    (if (< ang3 0)
        (setq ang3 (+ ang3 (* 2 pi))))
     (cond
        ((and (> ang3 0 ) (< ang3  (/ pi 2)))  
         (vla-put-Rotation obj ang2)  
         (vla-put-insertionpoint obj (vlax-3d-point p1))
         )
        ((and (> ang3 (/ pi 2)) (< ang3 pi))
         (vla-put-Rotation obj (- ang2 pi))
         (vla-put-insertionpoint obj (vlax-3d-point p1))
         )
        ((and (> ang3 pi) (< ang3  (* 3 (/ pi 2))))
         (vla-put-Rotation obj (- ang2 pi))
         (vla-put-insertionpoint obj (vlax-3d-point p2))
         )
        ((and (> ang3 (* 3 (/ pi 2))) (< ang3  (* 2 pi)))
         (vla-put-Rotation obj ang2)
         (vla-put-insertionpoint obj (vlax-3d-point p2))
         )            
       )
    )
   ((= code '(25 37)) (vla-delete obj))
   (T (setq loop nil))
   )
   )
  )[/pcode]


111.gif

评分

参与人数 1D豆 +4 收起 理由
XDSoft + 4 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-4-15 11:25:20 | 显示全部楼层
不错。支持个。
能实现功能。没BUG就可以了。其他没必要优化了。 耗时间的程序才需要优化呢。

点评

这句话说的好,耗费时间的更需要优化代码。不过黑龙朋友的意思是否可以在代码结构上有其他的方法实现,大家玩LISP,可以讨论下各种的实现,乐在其中。  发表于 2013-4-15 11:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 188个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 188个

财富等级: 日进斗金

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

使用道具 举报

 楼主| 发表于 2013-4-15 12:16:27 | 显示全部楼层

命令没有加载吧  这里的图块名称是11105  需要自己制作一个箭头得块

点评

不好意思,没有看程序。直接用的。没有注意。回头再测试一下。  发表于 2013-4-15 12:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 308个

财富等级: 日进斗金

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

使用道具 举报

 楼主| 发表于 2013-4-15 12:23:22 | 显示全部楼层
wowan1314 发表于 2013-4-15 11:25
不错。支持个。
能实现功能。没BUG就可以了。其他没必要优化了。 耗时间的程序才需要优化呢。

我的算法比较麻烦 通过偏移找到两边的插入点,一只在想有没有更简单的方法.还请大侠赐教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-15 12:38:21 | 显示全部楼层
本帖最后由 wowan1314 于 2013-4-15 12:41 编辑
adolfken 发表于 2013-4-15 12:23
我的算法比较麻烦 通过偏移找到两边的插入点,一只在想有没有更简单的方法.还请大侠赐教

没什么麻烦的!不偏移也得通过角度、距离求出来,代码比你的还长。

得到PT点选处曲线的角度A1,再算出A1垂直的角度A2,然后求出距PT点A2角度H距离处的点即为插入点。

另外我也初学,大家共同进步吧。我一般程序出来了就不管算法啦。除非是耗时间的程序就多考虑会。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-15 16:42:30 | 显示全部楼层
本帖最后由 adolfken 于 2013-4-15 18:39 编辑

在院长和wowan两位大侠的帮助下,我把代码按照正规的算法又重新写了一遍,在这里要感谢两位大侠.
[pcode=lisp,true]
(defun c:tt ()
          (vl-load-com)
          (setq acad (vlax-get-acad-object))
          (setq acaddocument (vla-get-activedocument acad))
          (setq mspace (vla-get-modelspace acaddocument))
          (setq h (getreal "\n请输入偏移距离"))
        (setq endata (entsel "\n请选择一条线"))
          (setq p0 (cadr endata))
        (setq l1 (vlax-ename->vla-object (car endata)))
          (setq p1 (vlax-curve-getclosestpointto l1 p0 t))
          (setq ang1 (angle p1 (mapcar '+ p1 (vlax-curve-getfirstderiv l1 (vlax-curve-getparamatpoint l1 p1)))))
        (setq p2 (polar p1 (+ ang1 (/ pi 2)) h))
          (setq p3 (polar p1 (- ang1 (/ pi 2)) h))
          (setq obj (vla-insertblock mspace (vlax-3d-point p2) "11005" 1 1 1 ang1))
          (setq loop t)
         (while loop
                  (setq code (grread t 8))
                  (cond
                          ((= (car code) 5)
                         (setq ang2 (- (angle p1 (cadr code)) ang1))  
                         (if (< ang2 0)
                             (setq ang2 (+ ang2 (* 2 pi))))
                          (cond
                             ((and (> ang2 0 ) (< ang2 (/ pi 2)))               
                              (vla-put-Rotation obj ang1)               
                              (vla-put-insertionpoint obj (vlax-3d-point p2))
                              )
                             ((and (> ang2 (/ pi 2) ) (< ang2 pi))               
                              (vla-put-Rotation obj (- ang1 pi))               
                              (vla-put-insertionpoint obj (vlax-3d-point p2))
                              )
                             ((and (> ang2 pi ) (< ang2  (* 3 (/ pi 2))))               
                              (vla-put-Rotation obj (- ang1 pi))               
                              (vla-put-insertionpoint obj (vlax-3d-point p3))
                              )
                             ((and (> ang2 (* 3 (/ pi 2))) (< ang2  (* pi 2)))               
                              (vla-put-Rotation obj ang1)               
                              (vla-put-insertionpoint obj (vlax-3d-point p3))
                              )
                            )
                         )
                        ((= (car code) 25) (setq loop nil) (vla-delete obj))
                        (T (setq loop nil))
                        )
          )
  )[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-15 19:03:42 | 显示全部楼层
adolfken 发表于 2013-4-15 12:16
命令没有加载吧  这里的图块名称是11105  需要自己制作一个箭头得块

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

使用道具 举报

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

使用道具 举报

已领礼包: 2064个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

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

使用道具 举报

 楼主| 发表于 2013-5-10 13:36:49 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-5-9 14:54
我是用qleader来画箭头的.

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

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 02:17 , Processed in 0.252648 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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