Mahadevan 发表于 2022-7-6 05:20:09

查找文本和中间点

你好
 
我不是Lisp程序的家庭,你能帮我做以下事情吗。
 
我想写一个lisp来做以下事情
1.我将提供一个文本,lisp应该从图形文件(我的意思是从当前打开的图形)中找到该文本。
2.如果找到文本,则应提供文本的中点。
 
提前谢谢。
 
马哈德凡

BIGAL 发表于 2022-7-6 05:28:53

不确定为什么没有答案在dwg中很容易找到文本
 
唯一的问题是,中点可能会因字体类型的不同而略有不同,但当设置为mid pt时,您可能可以使用“insertionpoint”来返回该点。
 
本例将打印出所有文本的插入点。
 
(setq ss (ssget (list (cons 0 "Text"))))
(setq len (sslength ss))
(setq x 0)
(repeat len
(setq en1 (ssname ss x))
       (setq el1 (entget en1))
       (setq v1 (atof (cdr (assoc 10 el1))))
(princ v1)
)

 
我现在不在工作,我相信有人会发布完整的解决方案。

gS7 发表于 2022-7-6 05:32:10

试试这个代码,希望对你有帮助
它将为您提供文本的插入点
 
(defun c:Test (/ string sset c ent insp point)
;;Ganesh Shetty
(if (setq string (strcase (getstring t "\nEnter String:: ")))
   (progn
   (if (setq sset (ssget "x"(list (cons 0 "TEXT,MTEXT"))))
       (progn
             
             (repeat (setq c (sslength sset))
                 (setq ent (entget (ssname sset (setq c (1- c)))))
                 (if (equal (strcase (cdr (assoc 1 ent))) string)
                     (progn
                        (if (or (= "MTEXT" (cdr (assoc 0 ent)))
                                  (and
                                      (zerop (cdr (assoc 72 ent)))
                                      (zerop (cdr (assoc 73 ent)))
                                  )
                              )
                              (setq insp (cdr (assoc 10 ent)))
                              (setq insp (cdr (assoc 11 ent)))
                           )
                           (setq point (strcat "E-" (rtos (car insp)) "," "N-" (rtos (cadr insp))))
                           (princ "\n")
                           (princ point)
                      )
                   )
             )
       )
   )
)
   )
(princ))

Mahadevan 发表于 2022-7-6 05:38:50

非常感谢BIGAL&gS7,我会试试这个,然后再给你回复。
 
当做
马哈德凡

jdiala 发表于 2022-7-6 05:42:56

试试这个。
 
;;; mid point of text or mtext ;;;
;;; JDiala 09-23-2013 ;;;
(vl-load-com)
(defun c:test (/ s ss pl)
(if
(setq ss (ssget "_X" (list (cons 0 "TEXT,MTEXT") (cons 1 (setq s (getstring t "\nEnter String :"))))))
(progn
   (repeat (setq i (sslength ss))
   (vla-GetBoundingBox
       (vlax-ename->vla-object
         (ssname ss (setq i (1- i)))
       ) 'p1 'p2
      )
    (setq pl
      (cons
      (mapcar
       (function
         (lambda (a b) (/ (+ a b) 2.))
          )
       (vlax-safearray->list p1)
       (vlax-safearray->list p2))
       pl
       )
   )
)
(princ pl)
   )
(princ (strcat "\nNothing found with \"" s " \" string on the drawing!"))
)
(princ)
)

gS7 发表于 2022-7-6 05:49:14

另一个
(defun c:Test2(/ s sset ent bpt ang tb pt1 mpoint)
;Gs7
(if (setq s (strcase (getstring t "\nEnter String::")))
   (progn
   (if (setq sset (ssget "_x" (list (cons 0 "TEXT,MTEXT"))))
       (progn
          (repeat (setq c (sslength sset))
                (setq ent (entget (ssname sset (setq c(1- c)))))
                (if (equal (strcase (cdr (assoc 1 ent))) s)
                  (progn
                      (setq Bpt (cdr (assoc 10 ent)))
                      (setq ang (cdr (assoc 50 ent)))
                      (setq Tb(cadr (textbox (list (assoc -1 ent)))))
                      (setq pt1 (polar bpt ang (/ (car tb) 2.0)))
                      (setq mpoint (polar pt1 (+ ang (/ pi 2.0)) (/ (cadr tb) 2.0)))
                      (princ "\n")
                      (princ mpoint)
                  )
               )
              )
       )
   )
)
   )
(princ))

Mahadevan 发表于 2022-7-6 05:51:58

非常感谢您的回复。
 
你们所付出的一切都是和弦一起工作。但它不适用于附图。这是因为圆(示例AD1)和圆的名称是单个对象。所以当我们尝试用AD1搜索时,它说没有找到文本。
 
在附图中,有一些圆圈,其名称在右侧和左侧,中间有一些数值。我们想用lisp做的就是找到给定名称的圆心(例如,如果给定文本AD1,它必须找到相应圆的中点)点1和数字(位于中间)点2的圆心,并从点1到点2绘制一条线。
 
现在,我面临一个问题:为给定的名称找到圆的中点(在X和Y两个方向上)和给定数值的中点(在X和Y两个方向上)。请帮我做同样的事。
拉斯特。图纸

gS7 发表于 2022-7-6 05:55:14

 
 
这是因为你在第一篇文章中提到了“文本”,你仍然用文本像圆圈一样调用它,因为你的信息是一个属性对象

Mahadevan 发表于 2022-7-6 06:04:03

非常感谢GS7。
 
我会试着给你回复。
 
-马哈德凡

gS7 发表于 2022-7-6 06:05:59

Mahadevan请试用Bellow Lisp程序
如果你有什么问题,请告诉我
在运行程序之前,请从图形中删除不需要的对象
 
 

;;Ganesh Shetty
;;27.09.2013
(defun c:blkl(/ string ss space n e p1 p2)
(vl-load-com)
(if
    (and
      (setq string (getstring "\nEnter String::"))
(setq ss (ssget "X" '((0 . "INSERT") (66 . 1))))
    )
    (progn
          (setq space (vla-get-modelspace
                     (vla-get-activedocument
                        (vlax-get-acad-object)
                     )
             )
   )
          (setq n (substr string 3 6))
          (repeat (setq i (sslength ss))
      (setq e (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
      (foreach b
             (Vlax-SafeArray->List
                      (variant-value
                           (vla-getattributes e)
                      )
             )
             (cond
                  ((equal (strcase(vla-get-Textstring b)) (strcase String))
                     (setq p1 (vla-get-textalignmentpoint b))
                  )
                  ((equal (vla-get-textstring b) n)
                      (setq p2 (vla-get-Textalignmentpoint b))
                  )
             )
      )
)
         (vla-addline space p1 p2)
      )
   )
(princ))
页: [1] 2
查看完整版本: 查找文本和中间点