找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1763|回复: 12

[矩形] 确定边后拉伸绘制矩形

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-11-10 09:31:08 | 显示全部楼层 |阅读模式
  • 插件名称 : 底边矩形
  • 作  者 : Newer
  • 运行环境 :XDRX API 
  • 发布时间 :2016-11-10
  • 命令名称 :XDTB_BottomRec
  • 插件介绍 :确定边后拉伸绘制矩形
  • 备  注 : (点击图片可以放大)
(点击图片可以放大)

晓东温馨提示 1、运行环境为 晓东工具箱XDRX API 的插件,请下载最新版本的 晓东工具箱XDRX API开发环境 一键安装
2、在ACAD中如何加载插件,请看 论坛插件使用方法
3、如果您有要求需要定制插件,请到 编程申请 论坛发帖求助

插件详细内容

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

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

×
本帖最后由 newer 于 2016-11-10 09:52 编辑

拖动矩形时候,可以输入垂边距离确定矩形大小。



[sell=5]
(defun c:XDTB_BottomRec ( / i kword p1 p2 pts w)
  (defun _kword (kword)
    (cond
      ((= kword "W")
        (if (setq w (getreal (xdrx_prompt "\n输入线宽度<" #pline_wid ">:" t)))
          (setq #pline_wid w)
        )
      )
      ((= kword "C")
        (if (setq w (getint (xdrx_prompt "\n输入颜色号<" #pline_color ">:" t)))
          (setq #pline_color w)
        )
      )
      (t
        (if (> i 0)
          (progn
            (xd::doc:command (list ".undo" 2))
            (setq i (1- i))
            (if (= i 0)
              (xdrx_prompt "\n所有回退已经完成.")
            )
          )
          (xdrx_prompt "\n所有回退已经完成.")
        )
      )
    )
  )
  (defun _prompt ()
    (xdrx_prompt "\n当前设置:线宽(" #pline_wid ") 颜色(" #pline_color ")")
    t
  )
  (xdrx_begin)
  (xdrx_sysvar_push '("osmode" 33))
  (if (not #pline_wid)
    (setq #pline_wid 1.0)
  )
  (if (not #pline_color)
    (setq #pline_color 7)
  )
  (setq i 0)
  (while (and
           (xdrx_initget (strcat "W C" (if (> i 0)
                                         " U"
                                         ""
                                       )
                         )
           )
           (_prompt)
           (setq p1 (getpoint (strcat "\n矩形第一点[线宽(W)/颜色(C)"
                                      (if (> i 0)
                                        "/回退(U)"
                                        ""
                                      ) "]<退出>:"
                              )
                    )
           )
         )
    (cond
      ((= (type p1) 'STR)
        (_kword p1)
      )
      ((= (type p1) 'LIST)
        (if (and
              (setq p2 (getpoint p1 "\n矩形底边第二点<退出>:"))
              (setq pts (XD::DRAG:RECTANG "\n矩形顶边右上点<退出>"
                                          (list p1 p2 "" 0)
                        )
              )
            )
          (progn
            (vla-startundomark **XD::Doc**)
            (setq i (1+ i))
            (xdrx_setpropertyvalue (entlast) "constantwidth" #pline_wid
                                   "color" #pline_color
            )
            (vla-endundomark **XD::Doc**)
          )
        )
      )
    )
  )
  (xdrx_sysvar_pop)
  (xdrx_end)
  (princ)
)
[/sell]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 4751个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2016-11-10 11:46:17 | 显示全部楼层
没试出这种效果,XD::DRAG:RECTANG的参数也有点问题(list p1 p2 "" 0)的右侧括号应该在p2后面
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 66个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 1304个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-11-10 14:44:33 | 显示全部楼层

你用的是最新的通用LISP函数库吗?

用下这个替换

(defun XD::Drag:Rectang (info pts / an dynpt en flag index
                              ins ll newpoint  per pl pnt v v0
                              
                        )
  (defun RecCallback1 (dynpt /)
    (setq ins (car (xd::pnts:orthoproject (list dynpt) p1 p2)))
    (setq vec (mapcar
                '-
                dynpt
                ins
              )
    )
    (if (not lastPnts)
      (setq lastPnts (cons dynpt lastPnts))
      (setq lastPnts (list dynpt (car lastPnts)))
    )
    (xdrx_polyline_setpointat en 2 (setq ret (mapcar
                                     '+
                                     p2
                                     vec
                                   ))
    )
    (xdrx_polyline_setpointat en 3 (mapcar
                                     '+
                                     p1
                                     vec
                                   )
    )
    (setq ret (trans ret 0 1))
    ret
  )
  (defun RecCallback2 (dynpt /)
    (setq p3 dynpt
          p2 (mapcar '+ p1 xdir)
          p2 (car (xd::pnts:orthoproject (list p3) p1 p2))
          p4 (car (xd::pnts:orthoproject (list p3) p1 (mapcar '+ p1 ydir)))
    )
    (if (not lastPnts)
      (setq lastPnts (cons dynpt lastPnts))
      (setq lastPnts (list dynpt (car lastPnts)))
    )
    (xdrx_polyline_setpointat en 1 p2)
    (xdrx_polyline_setpointat en 2 dynpt)
    (xdrx_polyline_setpointat en 3 p4)
    dynpt
  )        
  (defun myerr(msg)
     (princ (strcat "\n" msg))
     (setq *error* myerr)
     (xdrx_end)
     (XD::Doc:Command (list ".undo" 1))
  )
  (setq olderr *error*)
  (setq *error* myerr)
  (xdrx_begin)                               
  (setq p1 (car pts)
        p2 (cadr pts)
        flag 0
  )                                       ; the center of five-star
  (setq p1 (trans p1 1 0))
  (if p2
    (setq p2 (trans p2 1 0))
  )
  (setq xdir(getvar "ucsxdir")
        ydir (getvar "ucsydir")
  )
  (setvar "lastPoint" (trans p1 0 1))
  (if (not p2)
    (progn
      (setq ll (list p1 p1 p1 p1))
    )
    (progn
      (setq flag 1)
      (setq ll (list p1 p2 p2 p1))
      (setq v0 (mapcar
                 '-
                 p2
                 p1
               )
      )
      (setq an (angle p1 p2)) ; |start to drag it
    )
  )
  (initget 0)
  (setq en (apply
             'xdrx_polyline_make
             (cons T ll)
           )
  )
  (xdrx_pointmonitor (if (= flag 1)
                             "RecCallback1"
                             "RecCallback2"
                           )
  )
  (setq p3 (getpoint info))
  (xdrx_pointmonitor)
  (cond
    ((= (type p3) 'STR)
      (entdel e)
    )
    ((= (type ret) 'LIST)
      (if (not (equal (car lastpnts) (last lastpnts) 30))
        (progn
          (if (cadr pts)
            (progn
              (setq dis (distance (car lastpnts) p1)
                    vec (xdrx_vector_product (xdrx_vector_normalize vec) dis)
                    p3 (mapcar '+ p2 vec)
                    p4 (mapcar '+ p1 vec)
              )
              (xdrx_polyline_setpointat en 2 p3)
              (xdrx_polyline_setpointat en 3 p4)
              (setq p3 (trans p3 0 1))
            )
          )
        )
      )
    )
  )
  (setq *error* olderr)
  (xdrx_end)
  p3
)

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

使用道具 举报

已领礼包: 8727个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 8727个

财富等级: 富甲天下

发表于 2016-11-10 14:58:56 | 显示全部楼层
N版 (点击图片可以放大) 看不到啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2016-11-10 15:31:44 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-11-10 15:33:46 | 显示全部楼层

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

使用道具 举报

已领礼包: 87个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 65个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 13:56 , Processed in 0.315075 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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