明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6253|回复: 19

[求助]如何改变多段线的顶点顺序

  [复制链接]
发表于 2005-3-24 19:05:00 | 显示全部楼层 |阅读模式
如何改变多段线的顶点顺序
 楼主| 发表于 2005-3-24 20:02:00 | 显示全部楼层
难道真无人会吗?可怜啊!
 楼主| 发表于 2005-3-24 20:31:00 | 显示全部楼层
高手帮忙,在该多段线的顶点标注点号的时候,怎么可以指定起点位置,并按顺时针和逆时针标注点号?
发表于 2005-3-24 20:41:00 | 显示全部楼层
取出多段线的顶点坐标,重新生成一条多段线或者修改还来的多段线都可以实现。
发表于 2005-3-24 21:00:00 | 显示全部楼层
取得顶点坐标的方法,论坛里一大堆了,仔细找一找吧。


重新定义起点的方法:


1、选择起点startpt,用曲线函数vlax-curve-getClosestPointTo得到线上距离startpt最近的点nestpt。


2、检查nestpt距离线上最近的坐标。


3、根据以上数据调整坐标,重新生成多段线。
发表于 2005-3-24 21:05:00 | 显示全部楼层
陈Q的法子,受用!
 楼主| 发表于 2005-3-24 21:09:00 | 显示全部楼层
可以编个lisp程序吗?谢!
发表于 2005-3-25 08:44:00 | 显示全部楼层
程序功能:判断是顺时针还是逆时针,如果是顺时针则更改为逆时针。。。REV函数更改顶点顺序,可单独使用。。。
  1. (defun GetCen(pl / pt1 pt2)
  2.    (vla-getboundingbox (vlax-ename->vla-object pl) 'pt1 'pt2)
  3.    (setq pt1 (vlax-safearray->list pt1))
  4.    (setq pt2 (vlax-safearray->list pt2))
  5.    (list (/ (+ (car pt1) (car pt2)) 2.0)
  6.   (/ (+ (cadr pt1) (cadr pt2)) 2.0)
  7.    )
  8. )
  9. (defun GEO_CCW (p0 p1 p2 p3 / ang1 ang2 ang3)
  10.    (setq ang1 (angle p0 p1))
  11.    (setq ang2 (angle p0 p2))
  12.    (setq ang1 (- ang2 ang1))
  13.    (if (> (abs ang1) pi)
  14.        (setq ang1 (+ (* -2 pi (/ ang1 (abs ang1))) ang1))
  15.    )
  16.    (setq ang3 (angle p0 p3))
  17.    (setq ang2 (- ang3 ang2))
  18.    (if (> (abs ang2) pi)
  19.        (setq ang2 (+ (* -2 pi (/ ang2 (abs ang2))) ang2))
  20.    )
  21.    (if (> (* ang1 ang2) 0)
  22.        (/ ang1 (abs ang1))
  23.        (cond
  24.            ((> (abs ang1) (abs ang2))
  25.              (if (= ang2 0)
  26.    0
  27.    (/ ang2 (abs ang2)))
  28.              )
  29.            ((<= (abs ang1) (abs ang2))
  30.              (if (= ang1 0)
  31.    0
  32.    (/ ang1 (abs ang1)))
  33.            )
  34.        )
  35.    )
  36. );DEFUN
  37. (defun c:PlineCCW (/ pline step param nParam pt pt1 pt2 ptc i mp CCWLST)
  38.    (setq pline (car (entsel "Select lwpline")))
  39.    (setq step 100)
  40.    (setq mp (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  41.    (setq ptc (getcen pline))
  42.    (setq param (/ (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline)) step))
  43.    (setq i 0)
  44.    (repeat (1- step)
  45.        (setq nParam (* i param))
  46.        (setq pt (vlax-curve-getPointAtdist pline nParam))
  47.        (setq pt1 (vlax-curve-getPointAtdist pline (+ (* (/ 0.5 step) param) nParam)))
  48.        (setq pt2 (vlax-curve-getPointAtdist pline (+ (* (/ 1.0 step) param) nParam)))
  49.        (setq CCWLST (append CCWLST (list (GEO_CCW ptc pt pt1 pt2))))
  50.        (setq i (1+ i))
  51.    )
  52.    (if (> (length (vl-remove 1.0 CCWLST)) (length (vl-remove -1.0 CCWLST)))
  53.        (progn           
  54.            (rev pline)
  55.            (princ "\nPline is clockwise")
  56.            (princ "\nChanged to counterclockwise")
  57.        )
  58.        (princ "\nPline is counterclockwise")
  59.    )
  60.    (princ)
  61. ) ;end defun
  62. (defun Rev(pl / ents i m ptlst ptlst2 item)
  63.    (setq ents (entget pl))
  64.    (setq i 0)
  65.    (setq ptlst (reverse (member (assoc 10 ents) ents)))
  66.    (setq ptlst (cdr (member (assoc 10 ptlst) ptlst)))
  67.    (repeat (/ (length ptlst) 4)
  68.        (setq ptlst2 (append ptlst2 (list (list (nth i ptlst) (nth (+ i 1) ptlst) (nth (+ i 2) ptlst) (nth (+ i 3) ptlst)))))
  69.        (setq i (+ i 4))
  70.    )
  71.    (setq ptlst2 (mapcar '(lambda(x) (subst (cons 42 (- (cdr (assoc 42 x)))) (assoc 42 x) x)) ptlst2))
  72.    (setq ptlst2 (apply 'append ptlst2))
  73.    (setq i 0 m t ptlst nil)
  74.    (while m
  75.        (setq item (nth i (reverse ents)))
  76.        (setq ptlst (append ptlst (list item)))
  77.        (if (= (car item) 10) (setq m nil))
  78.        (setq i (1+ i))
  79.    )
  80.    (setq ptlst (reverse (subst (cons 42 (- (cdr (assoc 42 ptlst)))) (assoc 42 ptlst) ptlst)))
  81.    (setq ptlst2 (cons (car ptlst) ptlst2))
  82.    (setq ptlst2 (append ptlst2 (cdr ptlst)))
  83.    (setq i 0 m (vl-position (assoc 10 ents) ents) ptlst nil)
  84.    (repeat m
  85.        (setq ptlst (append ptlst (list (nth i ents))))
  86.        (setq i (1+ i))
  87.    )
  88.    (command "_.undo" "be")
  89.    (entmod (append ptlst ptlst2))
  90.    (command "_.undo" "e")
  91. )
 楼主| 发表于 2005-3-25 10:34:00 | 显示全部楼层
可以重新指定起点吗?
发表于 2005-3-26 20:28:00 | 显示全部楼层
起点不是可以随便指定的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 04:56 , Processed in 0.184991 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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