chengx2000 发表于 2011-8-20 09:24:14

求助:数值递增程序

先看图再说:


相信大家已经看明白了,我的程序就是将单行文字数值递增的复制了一定份数,但是目前我的这个程序只能处理左对正的单行文字,对于其他对正方式(如,“对齐”、“中间”等)就无能为力了,所有的单行文字都叠成一堆了,事后想了想问题肯定出在组码11上,但是我又不知道如何处理,选中的文字对正方式我想保留,故此想向给位请教。

还有一点,(entget (car (entsel "\nSelect the Number:"))),这里能不能像ssget那样进行一定的筛选,毕竟我只要带数字的单行文字。
代码如下:

(defun c:acc( / en lis add num p1 p2 x y st)
   (setq en (entget (car (entsel "\nSelect the Number:"))))
   (setq lis (list (assoc -1 en) (assoc 330 en) (assoc 5 en)))
   (foreach x lis
      (setq en (vl-remove x en))
      )
   (initget 7)
   (setq add (getreal "\nSpecify the accelerate number :"))
   (initget 7)
   (setq num (getint "\nSpecify the copies you need :"))
   (setq p1 (getpoint "\nGive me the direction and distance :")
       p2 (getpoint p1)
       dx (- (car p2) (car p1))
       dy (- (cadr p2) (cadr p1))
       x(cadr (assoc 10 en))
       y(caddr (assoc 10 en))
       st (atoi (cdr (assoc 1 en)))
       )
   (repeat num
      (setq x (+ x dx)
          y (+ y dy)
          st (fix (+ st add))
          )
      (setq en (subst (cons 1 (itoa st)) (assoc 1 en) en))
      (setq en (subst (cons 10 (list x y 0.0)) (assoc 10 en) en))
      (entmake en)
      (entmod en)
      )
   (prin1)
)


zhangcan0515 发表于 2017-9-15 16:58:05

不错 厉害了

chengx2000 发表于 2011-8-20 19:53:18

无奈的顶一顶!

Gu_xl 发表于 2011-8-20 21:44:43

(defun c:acc( / en lis add num p1 p2 x y st os)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
   (setq en (entget (setq ent (car (entsel "\nSelect the Number:")))))
   (setq lis (list (assoc -1 en) (assoc 330 en) (assoc 5 en)))
   (foreach x lis
      (setq en (vl-remove x en))
      )
   (initget 7)
   (setq add (getreal "\nSpecify the accelerate number :"))
   (initget 7)
   (setq num (getint "\nSpecify the copies you need :"))
   (setq p1 (getpoint "\nGive me the direction and distance :")
         p2 (getpoint p1)
         )
   (repeat num
   (command "copy" ent "" p1 p2)
   (setq ent (entlast))
   (setq enl (entget ent))
   (setq enl (subst (cons 1 (rtos (+ add (atof (cdr (assoc 1 enl)))) 2 0)) (assoc 1 enl) enl))
   (entmod enl)
      )
(setvar "osmode" os)
   (prin1)
)

chengx2000 发表于 2011-8-20 22:26:10

Gu_xl 发表于 2011-8-20 21:44 static/image/common/back.gif
(defun c:acc( / en lis add num p1 p2 x y st os)
(setq os (getvar "osmode"))
(setvar "osmode" 0 ...

版主提供的确实是一种方法,但是有没有不用command的方法呢?我指的意思是用entmake来产生图元。
谢谢Gu_xl版主!

caoyin 发表于 2011-8-20 22:34:41

本帖最后由 caoyin 于 2011-8-20 22:39 编辑

;;;entmake entmod 大多数时候可以直接更新,而没有必要remove诸如-1 330 5等组码,下面为例:
;;;1-------------------------------------------------------------------------------
(entmake (entget(car(entsel))));;原位置复制对象,可替代vla-copy
;;;2-------------------------------------------------------------------------------
(defun C:ACC ()
(setq ENT (entsel "\n选择数字:")
      P1(getpoint "\n指定基点: ")
      P2(getpoint P1 "\n制定下一点: ")
      I   (getint "\n指定递增数量: ")
      DD(getint "\n制定递增值: ");;只考虑整数
      ENT (entget (car ENT))
      ANG (angle P1 P2)
      DIS (distance P1 P2)
      P2(cdr (assoc 10 ENT))
      N   (atoi (cdr (assoc 1 ENT)))
)
(repeat I
    (setq N (+ N DD) P2 (polar P2 ANG DIS))
    (entmake
      (subst (cons 1 (itoa N))
             (assoc 1 ENT)
             (subst (cons 10 P2) (assoc 10 ENT) ENT)
      )
    )
)
)

chengx2000 发表于 2011-8-20 22:52:42

本帖最后由 chengx2000 于 2011-8-20 22:53 编辑

caoyin 发表于 2011-8-20 22:34 static/image/common/back.gif
;;;entmake entmod 大多数时候可以直接更新,而没有必要remove诸如-1 330 5等组码,下面为例:
;;;1------ ...
出现异样,如图:

不得不佩服版主程序的精炼,我原本也认为没什么问题,但是从结果上看文字的宽度比例显然出现了问题,而且和预期有很大的差异,这样的结果让我感到很差异!

caoyin 发表于 2011-8-20 23:16:22

请上传测试文件

xshrimp 发表于 2011-8-20 23:31:04

本帖最后由 xshrimp 于 2011-8-20 23:31 编辑

对于不同的文字对齐方式要修改组码 10 或11

(defun C:ACC ()
(setq ENT (entsel "\n选择数字:")
      P1(getpoint "\n指定基点: ")
      P2(getpoint P1 "\n制定下一点: ")
      I   (getint "\n指定递增数量: ")
      DD(getint "\n制定递增值: ");;只考虑整数
      ENT (entget (car ENT))
      ANG (angle P1 P2)
      DIS (distance P1 P2)            
      N   (atoi (cdr (assoc 1 ENT)))
      p10 (cdr (assoc 10 ENT))
      p11 (cdr (assoc 11 ENT))      
)
(repeat I
    (setq N (+ N DD) p11    (polar p11 ANG DIS) p10    (polar p10 ANG DIS))      
    (setq ent (subst (cons 11 P11)   (assoc 11 ENT) ENT))
    (setq ent (subst (cons 10 P10)   (assoc 10 ENT) ENT))
    (setq ent (subst (cons 1 (itoa N)) (assoc 1 ENT) ENT))
    (entmake ent)
    (princ)
)
)

chengx2000 发表于 2011-8-21 06:31:33

caoyin 发表于 2011-8-20 23:16 static/image/common/back.gif
请上传测试文件

我用的版本是AutoCAD2008,该文件是直接新建的,保存后为2004的版本。
测试选择的都是单行文字0,只有当“0”的对正方式为“左”时没问题,其余都有问题,尤其是“对齐”和“调整”更为怪异。

chengx2000 发表于 2011-8-21 06:54:49

xshrimp 发表于 2011-8-20 23:31 static/image/common/back.gif
对于不同的文字对齐方式要修改组码 10 或11

版主caoyin出现的问题也同样出现在你的程序里。
我觉得你对组码11的处理似乎牵强了点
谢谢你和版主caoyin,非常感谢。
页: [1] 2
查看完整版本: 求助:数值递增程序