[讨论]关于多边形点号坐标的计算
<p></p><p> </p>
<p>问题如下:有一多边形,每个点的坐标可以求出来,现在需要在节点的附近标注上序号,这个序号的文字得在多边形的外面,大概的如这图标显示的</p>
<p>K1到K5,有什么好的方法lisp实现吗?谢谢</p> ;;供參考,請依自己需求修改
;;依當前字高
;;依目前層
;;最靠近物件選取點為標示第一點
(vl-load-com)
(defun c:plist()
(setvar "cmdecho" 0)
(setq cly (getvar "clayer"))
(if (= (strcase cly) "TXTLIST")
(progn
(setvar "clayer" "0")
(setq cly "0")
)
)
(setq os (getvar "osmode"))
(setvar "osmode" 33)
(setq en (entsel))
(setq pts (car (cdr en)))
(masslist 10 (entget (car en)))
(setq i 0)
(setq dtget 100000.0)
(repeat (length nlist)
(setq dt (distance (nth i nlist) pts))
(setq dtget (min dt dtget))
(if (<= dt dtget)(setq pt1 (nth i nlist)))
(setq i (+ i 1))
)
(repeat (length nlist)
(setq ptlist (nth 0 nlist))
(setq ptlistn (cdr nlist))
(if (equal (distance pt1 ptlist) 0.0 0.1)
(setq listsort (cons ptlist ptlistn))
(setq nlist (append ptlistn (list ptlist)))
)
)
(setvar "osmode" 0)
(command "copy" en "" '(0 0) '(0 0))
(command "region" "l" "")
(setq en (ssget "l"))
(setq ename (ssname en 0))
(setq xobj (vlax-ename->vla-object ename))
(setq ptms (vla-get-Centroid xobj))
(setq ptms (vlax-safearray->list (variant-value ptms)))
(entdel (entlast))
(command "layer" "m" "TXTLIST" "C" 7 "TXTLIST" "")
(txtlist)
(initget "Y y N n")
(setq key (getkword "\n改變標示方向? < N >"))
(if (null key)(setq key "N"))
(if (= (strcase key) "Y")
(progn
(setq ss (ssget "X" '((0 . "TEXT")(8 . "TXTLIST"))))
(if (/= ss nil)(command "erase" ss ""))
(setq nlist (reverse nlist))
(setq nlist (cons (last nlist) (vl-remove (last nlist) nlist)))
(txtlist)
)
)
(setq ss (ssget "X" '((0 . "TEXT")(8 . "TXTLIST"))))
(command "chprop" ss "" "la" cly "")
(setvar "osmode" os)
(setvar "clayer" cly)
(prin1)
)
(defun masslist (key alist)
(setq nlist nil)
(foreach x alist
(if (eq key (car x))(setq nlist (cons (cdr x) nlist)))
)
(prin1)
)
(defun txtlist()
(setq i 0)
(foreach x nlist
(setq ptx (polar ptms (angle ptms x) (+ (distance x ptms) (getvar "textsize"))))
(command "text" "m" ptx "" "" (strcat "K" (rtos (+ i 1) 2 0)))
(setq i (+ i 1))
)
(prin1)
)
Thanks Very Much好好研究研究一下 <p>仔细研究了一下 ,发现 <font face="Verdana">(setq ptms (vlax-safearray->list (variant-value ptms)));_取得面域或实体的面积或质量的中点 如果是在多边形外的话,函数(<font face="Verdana">txtlist</font>)求到的文字插入点在多边形里面呢 还有没有好的处理方法吗?谢谢</font></p>
<p>如图 图片中红色线就是面域的中点</p>
<p> </p> 本帖最后由 作者 于 2010-7-1 13:02:34 编辑 <br /><br /> <p>原文字插入點可改為頂點夾角平分線對應的位置</p>
<p> </p>
<p>可以判斷文字插入點在線的那一側</p>
<p>或</p>
<p>文字插入點在封閉空間內外的方式再調整位置</p>
<p> </p>
<p>用第二個方式較容易</p> 将多边形向外复制偏移一个距离(距离大小视序号大小而定),取得偏移多边形各顶点坐标,删去偏移的多边形,这些坐标就是各对应序号标注的位置. 樓上的好方法,原已改好可滿足樓主的需求未發,再玩玩...代碼少了好多行 <p>8楼的程序在2006版本下运行出现:</p>
<p><font face="Verdana">命令: tt<br/>选多段线:<br/>错误: Automation 错误。未提供说明。<br/>程序执行完毕!</font></p>
<p> </p>
<p>不知是什么原因?请版主指教。</p>
<p>谢谢</p> <p>其实除了用偏移,还有其它的方法吗?使用计算的方法,本人数学基础不是很好,想了好久也没想出来 </p>
<p> 因为偏移的确不太完美,有时候多段线是无法偏移的。创建面域求质心的方法和偏移的也差不多,面域有时候也不能创建,这两个问题碰到好多了,除了没有选择,一般都不使用这两种方法参求参数。</p>
页:
[1]
2