明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4724|回复: 13

[讨论]关于多边形点号坐标的计算

  [复制链接]
发表于 2010-6-30 15:32:00 | 显示全部楼层 |阅读模式

 

问题如下:有一多边形,每个点的坐标可以求出来,现在需要在节点的附近标注上序号,这个序号的文字得在多边形的外面,大概的如这图标显示的

K1到K5,有什么好的方法lisp实现吗?谢谢

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2010-6-30 17:41:00 | 显示全部楼层
;;供參考,請依自己需求修改
;;依當前字高
;;依目前層
;;最靠近物件選取點為標示第一點
  1. (vl-load-com)
  2. (defun c:plist()
  3. (setvar "cmdecho" 0)
  4. (setq cly (getvar "clayer"))
  5. (if (= (strcase cly) "TXTLIST")
  6.    (progn
  7.      (setvar "clayer" "0")
  8.      (setq cly "0")
  9.    )
  10. )
  11. (setq os (getvar "osmode"))
  12. (setvar "osmode" 33)
  13. (setq en (entsel))
  14. (setq pts (car (cdr en)))
  15. (masslist 10 (entget (car en)))
  16. (setq i 0)
  17. (setq dtget 100000.0)
  18. (repeat (length nlist)
  19.    (setq dt (distance (nth i nlist) pts))
  20.    (setq dtget (min dt dtget))
  21.    (if (<= dt dtget)(setq pt1 (nth i nlist)))
  22.    (setq i (+ i 1))
  23. )
  24. (repeat (length nlist)
  25.    (setq ptlist (nth 0 nlist))
  26.    (setq ptlistn (cdr nlist))
  27.    (if (equal (distance pt1 ptlist) 0.0 0.1)
  28.      (setq listsort (cons ptlist ptlistn))
  29.      (setq nlist (append ptlistn (list ptlist)))
  30.    )
  31. )
  32. (setvar "osmode" 0)
  33. (command "copy" en "" '(0 0) '(0 0))  
  34. (command "region" "l" "")
  35. (setq en (ssget "l"))
  36. (setq ename (ssname en 0))
  37. (setq xobj (vlax-ename->vla-object ename))
  38. (setq ptms (vla-get-Centroid xobj))
  39. (setq ptms (vlax-safearray->list (variant-value ptms)))
  40. (entdel (entlast))
  41. (command "layer" "m" "TXTLIST" "C" 7 "TXTLIST" "")
  42. (txtlist)
  43. (initget "Y y N n")
  44. (setq key (getkword "\n改變標示方向? < N >"))
  45. (if (null key)(setq key "N"))
  46. (if (= (strcase key) "Y")
  47.    (progn
  48.      (setq ss (ssget "X" '((0 . "TEXT")(8 . "TXTLIST"))))
  49.      (if (/= ss nil)(command "erase" ss ""))
  50.      (setq nlist (reverse nlist))
  51.      (setq nlist (cons (last nlist) (vl-remove (last nlist) nlist)))
  52.      (txtlist)
  53.    )
  54. )
  55. (setq ss (ssget "X" '((0 . "TEXT")(8 . "TXTLIST"))))
  56. (command "chprop" ss "" "la" cly "")
  57. (setvar "osmode" os)
  58. (setvar "clayer" cly)
  59. (prin1)
  60. )
  61. (defun masslist (key alist)
  62.   (setq nlist nil)
  63.   (foreach x alist
  64.     (if (eq key (car x))(setq nlist (cons (cdr x) nlist)))
  65.   )
  66. (prin1)
  67. )
  68. (defun txtlist()
  69.   (setq i 0)
  70.   (foreach x nlist
  71.     (setq ptx (polar ptms (angle ptms x) (+ (distance x ptms) (getvar "textsize"))))
  72.     (command "text" "m" ptx "" "" (strcat "K" (rtos (+ i 1) 2 0)))
  73.     (setq i (+ i 1))
  74.   )
  75. (prin1)
  76. )
 楼主| 发表于 2010-6-30 22:25:00 | 显示全部楼层
Thanks Very Much  好好研究研究一下
 楼主| 发表于 2010-7-1 09:27:00 | 显示全部楼层

仔细研究了一下 ,发现 (setq ptms (vlax-safearray->list (variant-value ptms)));_取得面域或实体的面积或质量的中点 如果是在多边形外的话,函数(txtlist)求到的文字插入点在多边形里面呢 还有没有好的处理方法吗?谢谢

如图 图片中红色线就是面域的中点

 

本帖子中包含更多资源

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

x
发表于 2010-7-1 11:54:00 | 显示全部楼层
本帖最后由 作者 于 2010-7-1 13:02:34 编辑

原文字插入點可改為頂點夾角平分線對應的位置

 

可以判斷文字插入點在線的那一側

文字插入點在封閉空間內外的方式再調整位置

 

用第二個方式較容易

发表于 2010-7-1 20:59:00 | 显示全部楼层
将多边形向外复制偏移一个距离(距离大小视序号大小而定),取得偏移多边形各顶点坐标,删去偏移的多边形,这些坐标就是各对应序号标注的位置.
发表于 2010-7-1 21:11:00 | 显示全部楼层
樓上的好方法,原已改好可滿足樓主的需求未發,再玩玩...代碼少了好多行
发表于 2010-7-1 21:58:00 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2010-7-2 06:50:00 | 显示全部楼层

8楼的程序在2006版本下运行出现:

命令: tt
选多段线:
错误: Automation 错误。未提供说明。
程序执行完毕!

 

不知是什么原因?请版主指教。

谢谢

 楼主| 发表于 2010-7-2 11:05:00 | 显示全部楼层

其实除了用偏移,还有其它的方法吗?使用计算的方法,本人数学基础不是很好,想了好久也没想出来

  因为偏移的确不太完美,有时候多段线是无法偏移的。创建面域求质心的方法和偏移的也差不多,面域有时候也不能创建,这两个问题碰到好多了,除了没有选择,一般都不使用这两种方法参求参数。

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

本版积分规则

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

GMT+8, 2025-5-1 07:53 , Processed in 0.265396 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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