明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2101|回复: 14

求高手帮忙,判断文字在段范围内

  [复制链接]
发表于 2013-1-2 19:50 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 吴琦 于 2013-1-3 15:22 编辑

小弟初学lisp,实在想不明白怎么判断,求助明经各位大侠,第一次发帖,多支持下新手
条件是这样的
1.未知数目文字在同一直线上且旋转角度相同,文字角度0~360度都有可能
2.有多段直线段平行文字(可以简单的认为这多条直线在同一直线上),文字到线的距离可能正数,可能负数,也可能为零
3.文字无序分布在各条线段上

问题:如何判断哪些文字在哪些线段上?
然后怎么把这些文字分配到这些直线呢
因为lisp的变量好像不能带自变量的,比如L(i)这种表示方法行不通,
怎么把这线直线进行编号,然后把文字列出来,像下面这样
Line1-----text1.....text3
Line2-----text4  text5 text6 text6 text7
Line3-----text8
...........
Linen----..........-textm









附件: 您需要 登录 才可以下载或查看,没有账号?注册
发表于 2013-1-2 19:50 | 显示全部楼层
本帖最后由 USER2128 于 2013-1-3 18:13 编辑

  1. (defun c:tt ()
  2.   (setq line-pts '()
  3. cnt 0)
  4.   (if (setq lines (ssget '((0 . "line"))))
  5.     (progn
  6.       (repeat (sslength lines)
  7. (setq ent (entget (ssname lines cnt))
  8.        line-pts (cons (list (cdr (assoc 10 ent))
  9.        (cdr (assoc 11 ent)))
  10.         line-pts)
  11.        cnt (1+ cnt)
  12.        ))
  13.       (setq line-pts (reverse line-pts))
  14.       (setq txtent (mapcar '(lambda(u)
  15. (progn
  16.    (setq x (car u)
  17.   y (cadr u))
  18.    (setq dist (* (distance x y) 0.5)
  19.   ang  (angle x y))
  20.    (setq pt1 (polar x (+ (* pi 1.5) ang) dist)
  21.   pt2 (polar pt1 ang (* dist 2))
  22.   pt3 (polar y (+ (* pi 0.5) ang) dist)
  23.   pt4 (polar pt3 (+ ang pi) (* dist 2))
  24.   )
  25.    (setq txtmp (ssget "_WP" (list pt1 pt2 pt3 pt4) '((0 . "TEXT"))))
  26.    txtmp
  27.    )) line-pts))
  28.       (setq txts (mapcar '(lambda(x)
  29.         (progn
  30.    (setq cnt 0
  31.   txtmp '())
  32.    (repeat (if x (sslength x) 0)
  33.      (setq txtmp (cons (cdr (assoc 1 (entget (ssname x cnt))))
  34.          txtmp))
  35.      (setq cnt (1+ cnt))
  36.      )
  37.    txtmp)) txtent))
  38.       (setq cnt 1)
  39.       (mapcar '(lambda(x y z)
  40. (progn
  41.    (setq h (cdr (assoc 40 (entget (ssname y 0))))
  42.   h (/ h 1.25)
  43.   tmp (polar (car x) (angle (cadr x) (car x)) h)
  44.   )
  45.    
  46.    (entmake (list '(0 . "CIRCLE") (cons 10 tmp) (cons 40 h)))
  47.    (entmake (list '(0 . "TEXT") (cons 1 (itoa cnt))
  48.     (cons 40 (* h 1.25))
  49.     (cons 50 0.0) '(71 . 0) '(72 . 1) '(73 . 2)
  50.     (cons 10 tmp) (cons 11 tmp)))
  51.    (princ (strcat "\nLine" (itoa cnt) ":\t"))
  52.    (mapcar '(lambda(u) (princ u) (princ "\t")) z)
  53.    (setq cnt (1+ cnt))
  54.    )) line-pts txtent txts)
  55.       )
  56.     (princ "\n未选取直线!!!")
  57.     )
  58.   txtent
  59.   )
回复

使用道具 举报

发表于 2013-1-2 20:22 | 显示全部楼层
判断出来后,接下来要干什么?是移开、文字与对应线连线...
回复

使用道具 举报

 楼主| 发表于 2013-1-2 21:29 | 显示全部楼层
USER2128 发表于 2013-1-2 20:22
判断出来后,接下来要干什么?是移开、文字与对应线连线...

谢谢回复,是要对每条线上的数字求最大值
回复

使用道具 举报

 楼主| 发表于 2013-1-2 22:29 | 显示全部楼层
没人理我,自己想到方法了
回复

使用道具 举报

发表于 2013-1-2 23:07 来自手机 | 显示全部楼层
吴琦 发表于 2013-1-2 22:29
没人理我,自己想到方法了

什么办法,,,说来听听你怎么做到的
回复

使用道具 举报

 楼主| 发表于 2013-1-2 23:26 | 显示全部楼层
作垂线,分析垂点是否在该直线上
回复

使用道具 举报

发表于 2013-1-3 08:04 | 显示全部楼层
吴琦 发表于 2013-1-2 23:26
作垂线,分析垂点是否在该直线上

作垂线是较困难的,建议你分析线段中点到文字距离,分析出最短距离者为对应关系。
如只对文字求最大值,没必要理会直线的

评分

参与人数 1明经币 +1 收起 理由
吴琦 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-1-3 09:38 | 显示全部楼层
用 (ssget "_CP" pt_list '((0 . “*text") )) 即可!

pt_list 根据直线的两个端点和文字大小与直线距离相应计算而来!
回复

使用道具 举报

发表于 2013-1-3 09:43 | 显示全部楼层
嗯,按G版的思路比较可行
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-27 00:56 , Processed in 0.154343 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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