找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 974|回复: 13

[已解决] 两点向左右(或上下)偏移不同距离做选择集的包围盒,建议增加api函数

[复制链接]

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-6-3 10:13:30 | 显示全部楼层 |阅读模式
悬赏20D豆已解决
最新api将两点偏移(xdrx_points_offset)修改的与之前的版本不一致了,
我用两种方法做了两点向左右(或上下)偏移不同距离做选择集的包围盒,
感觉还是挺麻烦的,建议增加两点向左右(或上下)偏移的api函数

之前判断完两点的方向后,用(append (xdrx_points_offset d1 pts) (reverse (xdrx_points_offset d2 pts)))
就可以了,挺方便的。而且这种偏移不同距离的选择集包围盒常用。

t1、t2函数参数说明:
pts---两点点表
d1---向左或向上的偏移值
d2---向右或向下的偏移值

(defun t1(pts d1 d2 / v v1 v2 mat0 mat1 mat2 pts1 pts2)
        (setq v (mapcar '- (cadr pts) (car pts)))
        (if (or (minusp (car v)) (and (zerop (car v)) (minusp (cadr v))))
                (setq pts (reverse pts)
                        v (xdrx_vector_negate v)
                )
        )
        (setq v (xdrx_vector_PerpVector v))
        (setq v1 (xdrx_vector_Product v d1)
                v2 (xdrx_vector_Product v (- d2))
                mat0 (xdrx_matrix_identity 3)
                mat1 (xdrx_matrix_setTransLation mat0 v1)
                mat2 (xdrx_matrix_setTransLation mat0 v2)
                pts1 (XD::Pnts:TransForm pts mat1)
                pts2 (XD::Pnts:TransForm pts mat2)
        )
        (xdrx_setpropertyvalue (xdrx_polyline_make (append pts1 (reverse pts2)) t) "color" 2)
)


(defun t2(pts d1 d2 / v ang ang1 ang2 pt1 pt2 pt3 pt4)
        (setq v (mapcar '- (cadr pts) (car pts))
                ang (angle (car pts) (cadr pts))
        )
        (if (or (minusp (car v)) (and (zerop (car v)) (minusp (cadr v))))
                (setq pts (reverse pts)
                        ang (- ang pi)
                )
        )
        (setq ang1 (+ ang (* pi 0.5))
                ang2 (- ang (* pi 0.5))
                pt1 (polar (car pts) ang1 d1)
                pt2 (polar (cadr pts) ang1 d1)
                pt3 (polar (cadr pts) ang2 d2)
                pt4 (polar (car pts) ang2 d2)
        )
        (xdrx_setpropertyvalue (xdrx_polyline_make (list pt1 pt2 pt3 pt4) t) "color" 7)
)


t1是用api向量偏移做的,t2是用lisp函数做的

测试下效率:
为方便测试,取一条直线的两端点为pts
(defun c:tt(/ pts d1 d2)
        (setq pts (xdrx_entity_getstretchpoint (car(entsel)))
                d1 2000.
                d2 1000.
        );;;setq
        (repeat 5
                  (xd::quickbench '(
                                        (t1 pts d1 d2)
                                        (t2 pts d1 d2)
                                )
                )
        )
        (princ)
)


命令: TT
选择对象:
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4096 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(T2 PTS D1 D2)                    4096      1375       1375      3.86 <fastest>
(T1 PTS D1 D2)                    1024      1328       5312      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4096 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(T2 PTS D1 D2)                    4096      1360       1360      4.00 <fastest>
(T1 PTS D1 D2)                    1024      1359       5436      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4096 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(T2 PTS D1 D2)                    4096      1375       1375      3.96 <fastest>
(T1 PTS D1 D2)                    1024      1360       5440      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4096 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(T2 PTS D1 D2)                    4096      1360       1360      4.00 <fastest>
(T1 PTS D1 D2)                    1024      1359       5436      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4096 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(T2 PTS D1 D2)                    4096      1406       1406      3.91 <fastest>
(T1 PTS D1 D2)                    1024      1375       5500      1.00 <slowest>
-------------------------------------------------------------------------------


最佳答案

查看完整内容

试下2020.0604更新的API,新增加函数 (xdrx-points->offsetbox pts 上偏移距离 [下偏移距离 [左偏移距离 [右偏移距离]]]) 点表可以是一个点或多个点 偏移距离 上偏移必须参数,其他偏移可选,没指定时候同上偏移,可以灵活指定四个方向偏移 同时 (xdrx-getpropertyvalue line "tobox" up down left right) (xdrx-getpropertyvalue polyline "tobox" up down left right) (xdrx-getpropertyvalue 点表 "tobox" up down left right) ...

评分

参与人数 1D豆 +5 收起 理由
newer + 5 技术引导讨论和指点奖!

查看全部评分

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2020-6-3 10:13:31 | 显示全部楼层
试下2020.0604更新的API,新增加函数
(xdrx-points->offsetbox  pts 上偏移距离 [下偏移距离 [左偏移距离 [右偏移距离]]])

点表可以是一个点或多个点
偏移距离 上偏移必须参数,其他偏移可选,没指定时候同上偏移,可以灵活指定四个方向偏移
同时
(xdrx-getpropertyvalue line "tobox" up down left right)
(xdrx-getpropertyvalue polyline "tobox" up down left right)
(xdrx-getpropertyvalue 点表 "tobox" up down left right)
(xdge::getpropertyvalue lineseg3d几何实体 "tobox" up down left right)
(xdge::getpropertyvalue AcGeComposite3d几何实体 "tobox" up down left right)

xdrx-getpropertyvalue 支持点表作为参数,查询几何特性

点评

不好意思:第1条,你说明里已经说了,我没看清楚。  详情 回复 发表于 2020-6-4 09:01
刚才测试了下,该函数: 1、四个偏移值均为必填项,否则其他方向均按第一个值来偏移。即缺省的偏移值,均按第一个偏移值来偏移。 2、查询几何特征时,出现了下列问题: 命令: (xdrx-getpropertyvalue pts "tobox"  详情 回复 发表于 2020-6-4 08:54

评分

参与人数 1D豆 +10 收起 理由
dyjwyqz5221 + 10 热心帮忙奖!

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-3 11:25:49 | 显示全部楼层
这活,还是LISP做更方便

从一个点为中心 指定角度,上下左右不同距离偏移生成矩形框
  1. ;|
  2. 给点,宽度,高度,方向生成矩形框,UCS点
  3. |;
  4. (defun XD::Pnt:ToBox (pnt w h ang / direc norm v1 v1- v2 v2- x yAxis)
  5.   (setq        norm  (XD::UCS:zDir)
  6.         direc (xdrx_vector_rotate '(1 0 0) ang norm)
  7.         direc (xdrx_vector_normalize direc)
  8.         yAxis (xdrx_vector_perpVector direc)
  9.         v1    (mapcar '+
  10.                       (xdrx_vector_product direc (- (/ w 2.0)))
  11.                       (xdrx_vector_product yAxis (- (/ h 2.0)))
  12.               )
  13.         v1-   (xdrx_vector_negate v1)
  14.         v2    (mapcar '+
  15.                       (xdrx_vector_product direc (/ w 2.0))
  16.                       (xdrx_vector_product yAxis (- (/ h 2.0)))
  17.               )
  18.         v2-   (xdrx_vector_negate v2)
  19.   )
  20.   (mapcar '(lambda (x) (mapcar '+ pnt x))
  21.           (list v1 v2 v1- v2-)
  22.   )
  23. )

点评

有几个api函数还弄不太明白,我得研究下。  详情 回复 发表于 2020-6-3 14:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 5295个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-6-3 14:01:26 | 显示全部楼层
newer 发表于 2020-6-3 11:25
这活,还是LISP做更方便

从一个点为中心 指定角度,上下左右不同距离偏移生成矩形框

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-6-4 08:08:38 | 显示全部楼层
新增函数不知道在哪里查询?

点评

XDRX API提供的函数可以用下面方法得到 VL开头的函数到底有哪些? 看看就知道了15 个回复 - 2961 次查看所有的VL开头的函数都在这了,2323个函数 (defun c:get-vl-func () (setq a (atoms-family 1)) (setq b (map  详情 回复 发表于 2020-6-4 18:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-6-4 08:54:33 | 显示全部楼层
XDSoft 发表于 2020-6-3 10:13
试下2020.0604更新的API,新增加函数
(xdrx-points->offsetbox  pts 上偏移距离 [下偏移距离 [左偏移距离 [ ...

刚才测试了下,该函数:
1、四个偏移值均为必填项,否则其他方向均按第一个值来偏移。即缺省的偏移值,均按第一个偏移值来偏移。
2、查询几何特征时,出现了下列问题:
命令: (xdrx-getpropertyvalue pts "tobox" up down left right)
当前类不支持 tobox 属性查询,或参数不对.
nil
命令: (xdrx-getpropertyvalue (car(entsel)) "tobox" up down left right)
选择对象: nil
第1条修改不修改无所谓,四个偏移值都填上就可以了。关键是第2条。

点评

现在支持的是点表, 和 LINE,POLYLINE几何实体, 数据库实体下版本加上, 现在你可以转换DB实体到几何实体去实现 (setq e (xdge::constructor (car (entsel)))) (xdrx-getpropertyvalue e "tobox" up down left  详情 回复 发表于 2020-6-5 19:28
第一条 第一个偏移是必须项,其不给, 下,左,右都按第一个 给2个,就是 上下 限制, 左右同上 给3个,就是上,下,左限制, 右同 上  详情 回复 发表于 2020-6-5 19:19
第二条: 命令: !pts ((-9384.93 -5230.03 0.0) (20105.3 -5230.03 0.0) (20105.3 -4441.86 0.0) (-9384.93 -4441.86 0.0)) 命令: (xdrx-getpropertyvalue pts "tobox" 200.0) 命令: (xdrx-getpropertyv  详情 回复 发表于 2020-6-5 19:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2020-6-4 09:01:39 | 显示全部楼层
XDSoft 发表于 2020-6-3 10:13
试下2020.0604更新的API,新增加函数
(xdrx-points->offsetbox  pts 上偏移距离 [下偏移距离 [左偏移距离 [ ...

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2020-6-4 18:14:07 | 显示全部楼层
dyjwyqz5221 发表于 2020-6-4 08:08
新增函数不知道在哪里查询?

XDRX API提供的函数可以用下面方法得到

VL开头的函数到底有哪些? 看看就知道了
15 个回复 - 2961 次查看
所有的VL开头的函数都在这了,2323个函数 (defun c:get-vl-func () (setq a (atoms-family 1)) (setq b (mapcar '(lambda (x) (if (xdrx_string_regexps "^vl(.*)-" x) (strcase x t) ...
2016-11-26 00:56 - newer - A/VLISP

具体函数用法,可以发帖探讨

评分

参与人数 1D豆 +5 收起 理由
dyjwyqz5221 + 5 技术指导奖!

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-5 19:17:22 | 显示全部楼层
dyjwyqz5221 发表于 2020-6-4 08:54
刚才测试了下,该函数:
1、四个偏移值均为必填项,否则其他方向均按第一个值来偏移。即缺省的偏移值, ...

第二条:

命令: !pts
((-9384.93 -5230.03 0.0) (20105.3 -5230.03 0.0) (20105.3 -4441.86 0.0) (-9384.93 -4441.86 0.0))

命令: (xdrx-getpropertyvalue pts "tobox" 200.0)
<图元名: 2d7235925b0>

命令: (xdrx-getpropertyvalue pts "tobox" 200.0 100.0)
<图元名: 2d723592230>

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-5 19:19:04 | 显示全部楼层
本帖最后由 newer 于 2020-6-5 19:21 编辑
dyjwyqz5221 发表于 2020-6-4 08:54
刚才测试了下,该函数:
1、四个偏移值均为必填项,否则其他方向均按第一个值来偏移。即缺省的偏移值, ...

第一条

第一个偏移是必须项,其不给, 下,左,右都按第一个
给2个,就是 上下 限制, 左右同上
给3个,就是上,下,左限制, 右同 上
这么设置,是最大程度的方便你编程,如果上下左右偏移一样,你就给一个偏移参数就够了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-5 19:28:12 | 显示全部楼层
dyjwyqz5221 发表于 2020-6-4 08:54
刚才测试了下,该函数:
1、四个偏移值均为必填项,否则其他方向均按第一个值来偏移。即缺省的偏移值, ...

现在支持的是点表, 和 LINE,POLYLINE几何实体, 数据库实体下版本加上,
现在你可以转换DB实体到几何实体去实现

(setq e (xdge::constructor (car (entsel))))
(xdrx-getpropertyvalue e "tobox" up down left right) 或者 (xdge::getpropertyvalue e "tobox" up down left right)

或者直接转换成点表
(setq pts (xdrx-getsamplept (car (entsel))))
(xdrx-getpropertyvalue pts "tobox" up down left right)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 8612个

财富等级: 富甲天下

发表于 2020-6-5 21:02:43 | 显示全部楼层
(xdrx-getpropertyvalue pts "tobox" up down left right)返回的不应该是点表吗?怎么是实体名?可是又没有生成新的实体

点评

生成的是几何内存实体,多段线几何实体,类型 AcGeCompositeCrv3d (xdrx-type ent) 可以看到类型 (xdrx-getpropertyvalue ent)可以看到支持查询的N多属性方法 (xdrx-getpropertyvalue ent "vertices") 得到 顶点  详情 回复 发表于 2020-6-5 21:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-5 21:34:00 | 显示全部楼层
liuyj 发表于 2020-6-5 21:02
(xdrx-getpropertyvalue pts "tobox" up down left right)返回的不应该是点表吗?怎么是实体名?可是又没有 ...

生成的是几何内存实体,多段线几何实体,类型 AcGeCompositeCrv3d
(xdrx-type ent) 可以看到类型
(xdrx-getpropertyvalue ent)可以看到支持查询的N多属性方法
(xdrx-getpropertyvalue ent "vertices")  得到 顶点列表

想直接得到点表,用 (xdrx-points->offsetbox pts up down left right)

评分

参与人数 1D豆 +5 收起 理由
dyjwyqz5221 + 5 热心帮忙奖!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 02:08 , Processed in 0.456058 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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