找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 555|回复: 10

[BUG报告] API里两个函数的问题

[复制链接]

已领礼包: 8611个

财富等级: 富甲天下

发表于 2020-6-19 21:54:43 | 显示全部楼层 |阅读模式

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

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

×
1、xdrx_geom_IsParallel-p 经常失效,也不能设精度
2、xdrx_curve_getoffsetcurves 对直线有时向左偏移,有时向右偏移,找不到规律
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-19 22:12:04 | 显示全部楼层
本帖最后由 newer 于 2020-6-19 22:14 编辑

把你代码都贴出来,看你是怎么用的
偏移直线的时候,你注意直线的方向了吗?你要先排序,固定好直线的起始点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2020-6-19 23:39:44 | 显示全部楼层
getoffsetcurves 对直线,正数,总是往直线前进(起点,终点)方向的左侧偏移

如果两个方向,你输入正数都想向左上偏移,那么你就需要处理
  1. (defun c:tt ()
  2.   (if (and (setq e1 (car (xdrx-entsel "\n选择直线<退出>:")))
  3.            (setq dis (getreal "\n输入偏移距离(负数右下):"))
  4.       )
  5.     (progn (xdrx-getpropertyvalue e1 "startpoint" "endpoint")
  6.            (if (or (> (car #startpoint) (car #endpoint))
  7.                    (< (cadr #startpoint) (cadr #endpoint))
  8.                )
  9.              (xdrx-curve-reverse e1)
  10.            )
  11.            (xdrx-curve-getoffsetcurves dis e1)
  12.     )
  13.   )
  14.   (princ)
  15. )


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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2020-6-19 23:55:14 | 显示全部楼层
xdrx_geom_IsParallel-p 下版本API加入精度控制
通过(xdrx-document-setprec 0.1 角度) 控制,角度是 度,不是弧度
或者系统变量 (xdrx-setvar "tolEqualVector" 度数)
那么就是在多少度偏差内,是否平行

xdrx_geom_IsParallel-p 本质上是执行向量是否平行,最后执行的是 (xdrx_vector_IsParallel v1 v2)
xdrx_geom_IsParallel-p比 xdrx_vector_IsParallel 拓展的功能是除了判断向量是否平行,还能直接判断两个直线实体,或者几何直线实体是否平行

现在,你可以通过 xdrx_vector_IsParallel 来判断,这个函数支持精度 (xdrx_vector_IsParallel  v1 v2 tol) tol是度
  1. (defun c:tt ()
  2.   (if (and (setq e1 (car (xdrx-entsel "\n选择直线1<退出>:")))
  3.            (setq e2 (car (xdrx-entsel "\n选择直线2<退出>:")))
  4.            (setq tol (getreal "输入误差(度):"))
  5.            (xdrx-setvar "tolequalvector" tol)
  6.            (mapcar 'set '(p1 p2) (xdrx-getpropertyvalue e1 "get"))
  7.            (mapcar 'set '(p3 p4) (xdrx-getpropertyvalue e2 "get"))
  8.            (xdrx-vector-isparallel
  9.              (xdrx-vector-normalize (mapcar '- p2 p1))
  10.              (xdrx-vector-normalize (mapcar '- p4 p3))
  11.            )
  12.       )
  13.     (xdrx-prompt "\n两直线容差内平行")
  14.     (xdrx-prompt "\n两直线容差内不平行")
  15.   )
  16.   (princ)
  17. )



可以写成

  1. (defun c:tt ()
  2.   (if (and (setq e1 (car (xdrx-entsel "\n选择直线1<退出>:")))
  3.            (setq e2 (car (xdrx-entsel "\n选择直线2<退出>:")))
  4.            (setq tol (getreal "输入误差(度):"))
  5.            (xdrx-setvar "tolequalvector" tol)
  6.            (setq v1 (xdrx-getpropertyvalue e1 "direction")
  7.                  v2 (xdrx-getpropertyvalue e2 "direction"))
  8.            (xdrx-vector-isparallel
  9.              v1
  10.              v2
  11.            )
  12.       )
  13.     (xdrx-prompt "\n两直线容差内平行")
  14.     (xdrx-prompt "\n两直线容差内不平行")
  15.   )
  16.   (princ)
  17. )


点评

(xdrx-vector-isparallel (xdrx-vector-normalize (mapcar '- p2 p1)) (xdrx-vector-normalize (mapcar '- p4 p3)) ) 不用换算成单位方向向量也可以吧, (xdrx-vector-isparallel  详情 回复 发表于 2020-6-20 14:45

评分

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

查看全部评分

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

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

 楼主| 发表于 2020-6-20 00:30:53 | 显示全部楼层
本帖最后由 liuyj 于 2020-6-20 00:33 编辑

就想写个对于任意曲线都适用的判断平行的函数
  1. ;;判断两直线平行,不考虑重合.
  2. ;;参数: li1,li2 为直线实体名.
  3. ;;返回: 平行返回T,不平行返回nil.
  4. (defun is= (li1 li2 / v1 v2 an1 an2)
  5.   (setq        v1  (vlax-curve-getfirstderiv li1 (vlax-curve-getstartparam li1))
  6.         v2  (vlax-curve-getfirstderiv li2 (vlax-curve-getstartparam li2))
  7.         an1 (angle '(0. 0. 0.) v1)
  8.         an2 (angle '(0. 0. 0.) v2)
  9.   )
  10.   (equal (rem (- an1 an2) PI) 0. 1e-3)
  11. )
  12. ;;;曲线是否平行,对所有曲线均适用
  13. (defun parallel        (e1 e2 pfuzz / pts dis perpt)
  14.   ;;  rem reduces angles > pi so range is 0 - 180 deg
  15.   (cond        ((and (= (dxf1 0 e1) "LINE") (= (dxf1 0 e2) "LINE"))
  16. ;;;         (xdrx_geom_IsParallel-p e1 e2)
  17.          (is= e1 e2)
  18.         )
  19.         ((and (= (dxf1 0 e1) "ARC") (= (dxf1 0 e2) "ARC"))
  20.          (if (and (vlax-property-available-p (vlax-ename->vla-object e1) 'center)
  21.                   (vlax-property-available-p (vlax-ename->vla-object e2) 'center)
  22.              )
  23.            (equal (vla-get-center (vlax-ename->vla-object e1))
  24.                   (vla-get-center (vlax-ename->vla-object e2))
  25.                   pfuzz
  26.            )
  27.          )
  28.         )
  29.         (T
  30.          (setq pts   (xdrx_curve_getSamplePoints e1 6)
  31.                perpt (xdrx_curve_getClosestPoint e2 (car pts) T)
  32.                dis   (distance (car pts) perpt)
  33.          )
  34.          (vl-every '(lambda (d) (equal dis d pfuzz))
  35.                    (mapcar '(lambda (p) (distance p (xdrx_curve_getClosestPoint e2 p T))) (cdr pts))
  36.          )
  37.         )
  38.   )
  39. )

后来发现还是精度的问题,差一点点都不行,就这么改了一下

点评

很多API直接得到属性的,用lisp看着太乱了。 用xdrx_vector_IsParallel  详情 回复 发表于 2020-6-20 01:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

 楼主| 发表于 2020-6-20 00:44:37 | 显示全部楼层
偏移的问题我是做了判断的
  1. ;;;点在曲线的哪一侧
  2. (defun onwhichside (e pt / p1 p2)
  3.   (if (= (xdrx_getpropertyvalue e "IsA") "AcDbLine")
  4.     (setq p1 (dxf1 10 e)
  5.           p2 (dxf1 11 e)
  6.     )
  7.     (if        (setq p1 (xdrx_curve_getclosestpoint e pt T))
  8.       (setq p2 (mapcar '+ p1 (xdrx_curve_getfirstderiv e p1)))
  9.     )
  10.   )
  11.   (xdrx_line_OnwhichSide p1 p2 pt)
  12. )
  13. (defun curve_getoffsetcurves (e pt / ds p1 ob side)
  14.   (if (setq p1 (xdrx_curve_getclosestpoint e pt T))
  15.     (setq ds (distance pt p1))
  16.   )
  17.   (setq        ob   (vlax-ename->vla-object e)
  18.         side (onwhichside e pt)
  19.   )
  20.   (if (= (xdrx_getpropertyvalue e "IsA") "AcDbLine")
  21.     (cond ((= side -1) (vla-offset ob ds))
  22.           ((= side 1) (vla-offset ob (* -1 ds)))
  23.     )
  24.     (cond ((= side -1) (vla-offset ob (* -1 ds)))
  25.           ((= side 1) (vla-offset ob ds))
  26.     )
  27.   )
  28. )

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-6-20 01:06:16 | 显示全部楼层
liuyj 发表于 2020-6-20 00:30
就想写个对于任意曲线都适用的判断平行的函数
后来发现还是精度的问题,差一点点都不行,就这么改了一下
...

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-6-20 14:45:56 | 显示全部楼层
XDSoft 发表于 2020-6-19 23:55
xdrx_geom_IsParallel-p 下版本API加入精度控制
通过(xdrx-document-setprec 0.1 角度) 控制,角度是 度, ...

(xdrx-vector-isparallel
             (xdrx-vector-normalize (mapcar '- p2 p1))
             (xdrx-vector-normalize (mapcar '- p4 p3))
)

不用换算成单位方向向量也可以吧,
(xdrx-vector-isparallel  (mapcar '- p2 p1) (mapcar '- p4 p3))

点评

函数内部自动处理成单位向量了 但编程时候是种风格,明确概念  详情 回复 发表于 2020-6-20 18:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2020-6-20 18:29:17 | 显示全部楼层
dyjwyqz5221 发表于 2020-6-20 14:45
(xdrx-vector-isparallel
             (xdrx-vector-normalize (mapcar '- p2 p1))
             (xdr ...

函数内部自动处理成单位向量了
但编程时候是种风格,明确概念

评分

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

查看全部评分

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

使用道具 举报

已领礼包: 166个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:55 , Processed in 0.453585 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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