tigcat 发表于 2020-12-4 00:58:22

文字循环检查【已解决】

本帖最后由 tigcat 于 2020-12-4 17:03 编辑

;|程序又是组装的,想实现相邻不远处文字比较,请大神写了个,代码我看不懂,本着学习的态度,自己写了(组装)了下面这个,现在问题是我想批量选取所有文字比较,但尴尬的是我只能选两个文字检查,多了程序就没反应。想实现的功能是,两个文字,距离在一定范围(比如1500,假设字高300的情况下),如果两个文字内容不同,做个标记,写个文字或者画个圆都行;如果一个文字周边指定范围无其他文字,也做个标记。肯定大侠看看哪出了问题,帮我优化完善下代码,先谢谢了|;
;里面部分代码是Z版删除重叠文字的,dxf子函数代码复制某位大侠的,其他自己乱拼凑写的

(defun C:f1 (/            dxf1   dxf10dxf101 dxf11      dxf40dxf401 en
             en_data         en1          k         m      n      ss   dis
             pta    ptb         ss1          n2         i
            )
(vl-load-com)
(defun dxf (key ename) (cdr (assoc key (entget ename))))
(setq ss (ssget '((0 . "*TEXT"))))
(setq      i    -1
       i2   0;i2不应放在此处
      dist 2500
;;;      t0   (* 86400 (getvar "tdusrtimer"))
)
;;;   (or (setq dist (getreal "\输入文字高度: <1500>")) (setq dist 1500))
(setq lis (ssadd))
(while (setq en (ssname ss (setq i (1+ i))))
    (setq dxf10 (dxf 10 en))
    (setq dxf1 (dxf 1 en)
          pta(list (- (car dxf10) dist) (- (cadr dxf10) dist))
          ptb(list (+ (car dxf10) dist) (+ (cadr dxf10) dist))
          ss1(ssget "c" pta ptb)
          ss1(ssget "P" '((0 . "*TEXT")))
          n2   (sslength ss1)应在此处放置i2变量
    )
    (if      (> n2 1)
      (progn
      (setq ss1 (ssdel en ss1))
      (setq n2 (1- (sslength ss1)))
      (while (<= i2 n2)
          (setq en2 (ssname ss1 i2))
          (setq dxf2 (dxf 1 en2))
          (setq i2 (1+ i2))
          (if (/= dxf2 dxf1)
            (progn
            (command "circle" (dxf 10 en2) "1000")
            (command "circle" (dxf 10 en) "1000")
            )
;;;            (command "circle" (dxf 10 en) "1000")
          )
      )
      )
      (command "circle" (dxf 10 en) "1000")
    )
;;;    (setq ss (ssdel en ss))
;;;    (setq s (1+ s))
)
;;;(setq t1 (* 86400 (getvar "tdusrtimer")))
;;;(princ (strcat "耗时:"
;;;               (rtos (- t1 t0) 2 3)
;;;         )
;;;)
(princ)
)
;请大侠帮忙看下程序到底哪出了问题。



tigcat 发表于 2020-12-4 09:06:59

是不是循环出问题了呢?

tigcat 发表于 2021-8-3 14:32:56

本帖最后由 tigcat 于 2021-8-3 14:34 编辑

(defun C:f1 (/            dxf1   dxf10dxf101 dxf11      dxf40dxf401 en
             en_data         en1          k         m      n      ss   dis
             pta    ptb         ss1          n2         i
            )
(vl-load-com)
(defun dxf (key ename) (cdr (assoc key (entget ename))))
(setq ss (ssget '((0 . "*TEXT"))))
(setq      i    -1
             dist 2500
;;;      t0   (* 86400 (getvar "tdusrtimer"))
)
;;;   (or (setq dist (getreal "\输入文字高度: <1500>")) (setq dist 1500))
(setq lis (ssadd))
(while (setq en (ssname ss (setq i (1+ i))))
    (setq dxf10 (dxf 10 en))
    (setq dxf1 (dxf 1 en)
          pta(list (- (car dxf10) dist) (- (cadr dxf10) dist))
          ptb(list (+ (car dxf10) dist) (+ (cadr dxf10) dist))
          ss1(ssget "c" pta ptb)
          ss1(ssget "P" '((0 . "*TEXT")))
          n2   (sslength ss1)
          i2 0
    )
    (if      (> n2 1)
      (progn
      (setq ss1 (ssdel en ss1))
      (setq n2 (1- (sslength ss1)))
      (while (<= i2 n2)
          (setq en2 (ssname ss1 i2))
          (setq dxf2 (dxf 1 en2))
          (setq i2 (1+ i2))
          (if (/= dxf2 dxf1)
            (progn
            (command "circle" (dxf 10 en2) "1000")
            (command "circle" (dxf 10 en) "1000")
            )
;;;            (command "circle" (dxf 10 en) "1000")
          )
      )
      )
      (command "circle" (dxf 10 en) "1000")
    )
;;;    (setq ss (ssdel en ss))
;;;    (setq s (1+ s))
)
;;;(setq t1 (* 86400 (getvar "tdusrtimer")))
;;;(princ (strcat "耗时:"
;;;               (rtos (- t1 t0) 2 3)
;;;         )
;;;)
(princ)
)
页: [1]
查看完整版本: 文字循环检查【已解决】