明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5659|回复: 11

[基础] [求助]判断线顺时针还是逆时针提示错误

[复制链接]
发表于 2010-2-26 13:44:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-2-26 14:32:44 编辑

;;本人刚学习LISP ,请高手指教一下

下面是mjtd.com的判断“顺时针”还是“反时针”

;;我的CAD是2002的,使用cad2008也不行

;;调试出现“ActiveX 服务器返回错误: 未知名称: Length”错误提示

(defun C:test(/ ss fd ang offsetObj plineObj)
  (if (setq ss (ssget ":s" '((0 . "*POLYLINE"))));;"LWPOLYLINE"也不行吗
   (progn
    (setq plineObj (vlax-ename->vla-object (ssname ss 0)))
    (setq fd (vlax-curve-getFirstDeriv plineObj 0.5))
    (setq ang (atan (/ (cadr fd) (car fd))))
    (setq offsetplineObj (car (vlax-safearray->list
      (vlax-variant-value
        (vla-offset plineObj 0.0001)))))
    (if (> (vla-get-length plineobj) (vla-get-length offsetplineobj))
       (princ "\n顺时针.")
       (princ "\n反时针.")
    )
    (vla-delete offsetplineObj)
   );progn
   (princ "\nNo object selected or object selected is not a polyline.")
 );end_if
 (princ)
)

;;;;经过如下修改也不行吗,奇怪

(defun C:ta(/ ss fd ang offsetObj plineObj)
  (vl-load-com)
  (setq ent (car (entsel "\n选取多线:\n")))
  (setq PLTYPE (cdr (assoc 0 (entget ent))))
  ;;(setq ss (ssget ":s" '((0 . "LWPOLYLINE"))));"LWPOLYLINE"
  (if (or (= "POLYLINE" PLTYPE) (= "LWPOLYLINE" PLTYPE))
   (progn
    ;(setq plineObj (vlax-ename->vla-object (ssname ss 0)))
    (command "lengthen" ent "")
    (setq plineObj (vlax-ename->vla-object ent))
    (setq fd (vlax-curve-getFirstDeriv plineObj 0.5))
    (setq ang (atan (/ (cadr fd) (car fd))))
    (setq offsetplineObj (car (vlax-safearray->list
      (vlax-variant-value
        (vla-offset plineObj 0.0001)))))
    (if (> (vla-get-length plineobj) (vla-get-length offsetplineobj))
       (princ "\n顺时针.")
       (princ "\n反时针.")
    )
    (vla-delete offsetplineObj)
   );progn
   (princ "\nNo object selected or object selected is not a polyline.")
 );end_if
 (princ)
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-11-2 13:32:55 | 显示全部楼层
本帖最后由 vormittag 于 2011-11-3 12:11 编辑

对于平面曲线的顺、逆时针判断可以采用数学的方法。
已知平面三点(xi yi)、(xj yj) 、(xk yk),如果我们对三角形面积的值域取实数,则三角形面积计算公式如下:

其中:当三点以顺时针排列时 A 为负,当三点为逆时针排列时 A 为正。

可以证明:当 (x1 y1)  (x2 y2)  (x3 y3) ... (xn yn) 为沿折线走向排列的折线顶点时:

为折线围成的多边形(若起终点不重合,则补充终点至起点的直线构成多边形)的面积,且当这n个点顺时针排列时, A 为负,当n点为逆时针排列时 A 为正。

根据这个算法可以得到判断由n个点构成的折线其走向的函数。
完全代码如下:
  1. ;;; 按计算三角形oij的倍面积
  2. (defun calo2A (pti ptj)
  3.   (- (* (car pti) (cadr ptj)) (* (car ptj) (cadr pti)))
  4. )

  5. ;;; 判断多段线是否为逆时针走向,ename图元必须为LWPOLYLINE
  6. (defun clockwisep (ename / ptlist)
  7.   (setq ptlist (apply 'append (mapcar '(lambda (x) (if (= 10 (car x)) (list(cdr x)))) (entget ename))))
  8.   (>  (apply '+ (mapcar 'calo2A (cons (last ptlist)(reverse (cdr (reverse ptlist)))) ptlist))
  9.     0
  10.   )
  11. )
上面代码对逆时针走向的LWPOLYLINE返回T,共线或顺时针走向返回nil

补充说明一点:对于只有两个顶点的LWPOLYLINE返回值必然是nil,如果是两个顶点的圆弧形式的多段线,再补充一个中点即可,对于三个顶点以上,不论是否含有弧线段,上面的代码均成立。


本帖子中包含更多资源

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

x

点评

真正厉害的人,学习真的很重要  发表于 2018-1-22 10:40

评分

参与人数 2明经币 +2 收起 理由
hhh454 + 1 赞一个!
自贡黄明儒 + 1 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2010-12-9 12:54:16 | 显示全部楼层
(vla-get-length plineobj)中plineobj应该没有length这个属性项吧;(command "lengthen" ent "")中ent是vl物件,这肯定会出错的。
发表于 2010-12-9 12:55:10 | 显示全部楼层
调试时跟踪一下就知道了。
发表于 2011-11-2 11:14:55 | 显示全部楼层
没看懂,谁能帮忙注释一下呀,一个lisp,太多的vla,看帮助,也是迷糊
发表于 2011-11-2 21:57:25 | 显示全部楼层
哪位大师,能把楼主的程序调试一下。最好能批量的把顺逆时针的多短线用颜色给区分出来。多谢了!
发表于 2013-11-17 17:18:31 | 显示全部楼层
vormittag 发表于 2011-11-2 13:32
对于平面曲线的顺、逆时针判断可以采用数学的方法。
已知平面三点(xi yi)、(xj yj) 、(xk yk),如果我们对 ...

这个太经典了!!
毫不客气拿走
学习之。。。
发表于 2013-11-17 18:13:29 | 显示全部楼层
  1. ; 二维多段线顺时针转还是逆时针转的判断
  2. ; 判断原理:当二维多段线顺时针转时,
  3. ;   使用(vla-offset obj 0.001)会使其往内偏移,面积
  4. ;   比偏移前小;反之,会往外偏移,面积比偏移前大。
  5. (defun c:test()
  6.     (vl-load-com)
  7.     (while (setq ssa (ssget ":s" '((0 . "LWPOLYLINE"))))
  8.         (setq Obj (vlax-ename->vla-object (ssname ssa 0)))
  9.         (vla-offset obj 0.001)
  10.         (setq obj1 (vlax-ename->vla-object (entlast))
  11.               mj0  (vlax-get obj "area")
  12.               mj1  (vlax-get obj1 "area")
  13.         )
  14.         (if (> mj0 mj1)
  15.             (princ "\n顺时针")
  16.             (princ "\n逆时针")
  17.         )
  18.         (vla-delete obj1)
  19.     )
  20.     (princ)
  21. )
发表于 2014-11-8 12:17:44 | 显示全部楼层
vormittag 发表于 2011-11-2 13:32
对于平面曲线的顺、逆时针判断可以采用数学的方法。
已知平面三点(xi yi)、(xj yj) 、(xk yk),如果我们对 ...

太好了。终于找到了。谢谢。
发表于 2015-5-23 14:55:44 | 显示全部楼层
新人学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-20 07:51 , Processed in 0.204068 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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