tungtat 发表于 2018-4-19 15:48:16

CAD转钻孔帮忙修改

本帖最后由 tungtat 于 2018-4-19 15:49 编辑

公司前辈写的这个程式现想偷懒,如何把输出的文件名定为数字的文件,并且把文件输出在c:\nc目录(如dwg文件名为 " PCB1234MT.dwg" 自动取文件名中的1234加上P.NC即输出的文件名为 1234P.NC)。最后需在CAD内自动输入所输出的文件名.如附图片。
(defun c:db()
   (setvar "cmdecho" 0)
   (setq file2 (getstring "\n 请输入路径及文件名"))   此处原来需手工输入要实现自动输出在C:\NC\dwg文件名的数字+p.NC组合
   (setq file3(open file2 "w"))
   (if(= file3 nil)
      (progn
      (alert"路径或文件名错误!")
      (exit)
      )
      )
(princ "请选择要钻孔的圆:")
   (setq a (ssget))
   (setq n (sslength a))
   (setq i 0 m 0)
   (repeat n
   (setq en(ssname a i))
   (setq endata(entget en))
   (setq entype(cdr (assoc 0 endata)))
   (if(= entype "CIRCLE")
      (progn
       (setq x(cadr(assoc 10 endata)))
       (setq y(caddr(assoc 10 endata)))
       (princ "X" file3)
       (princ (rtos x 2 3) file3)
       (princ "" file3)
       (princ "Y" file3)
       (princ (rtos y 2 3) file3)
       (princ "\n" file3)
       (setq m (+ 1 m))
      )
   )
   (setq i (+ 1 i))
   )
(princ (strcat "\n共有<" (itoa m) ">孔被选取!"))
(close file3)
(prin1)
)

yxp 发表于 2018-4-21 10:19:32

我的语文没学好,看不懂题意,无奈.

ntwison 发表于 2018-4-21 20:14:54

本帖最后由 ntwison 于 2018-4-21 20:17 编辑

(defun c:db()
   (setvar "cmdecho" 0)
   (setq FN (getvar "dwgname")); PCB1234MT.dwg
   (setq n 1 k 0)
   (While (> n 0)
   (setq Tac (vl-string-elt FN k))
         (if (and (> Tac 47)(< Tac 58));0是48,9是57
             (setq n 0)
               (setq k (1+ k))
   )
   )
   (setq FN (substr FN (+ k 1)))
   (setq n 1 k 0)
   (While (> n 0)
   (setq Tac (vl-string-elt FN k))
         (if (> Tac 64);65是大写字母A
             (setq n 0)
               (setq k (1+ k))
   )
   )
   (setq FN (substr FN 1 k))
   (setq file2 (strcat "C:\\NC\\" FN "p.NC"))
   ;(setq file2 (getstring "\n 请输入路径及文件名"))
   (setq file3(open file2 "w"))
   (if(= file3 nil)
      (progn
      (alert"路径或文件名错误!")
      (exit)
      )
      )
(princ "请选择要钻孔的圆:")
   (setq a (ssget))
   (setq n (sslength a))
   (setq i 0 m 0 Lzb nil)
   (repeat n
   (setq en(ssname a i))
   (setq endata(entget en))
   (setq entype(cdr (assoc 0 endata)))
   (if(= entype "CIRCLE")
      (progn
         (setq ZB (cdr(assoc 10 endata)))
         (setq Lzb (cons ZB Lzb))
       (setq x(cadr(assoc 10 endata)))
       (setq y(caddr(assoc 10 endata)))
       (princ "X" file3)
       (princ (rtos x 2 3) file3)
       (princ "" file3)
       (princ "Y" file3)
       (princ (rtos y 2 3) file3)
       (princ "\n" file3)
       (setq m (+ 1 m))
      )
   )
   (setq i (+ 1 i))
   )
(princ (strcat "\n共有<" (itoa m) ">孔被选取!"))
(prin1)
(close file3)
(setq R_c (cdr(assoc 40 endata)))
      (setq Tzb1(Last Lzb))      
      (setq Tzb2 (last (reverse Lzb)))
      (setq Txzb (- (* 1.5 (car Tzb1)) (* 0.5 (car Tzb2))))
      (setq Tyzb (* 0.5 (+ (cadr Tzb2) (cadr Tzb1))))
      (setq Tzb (list Txzb Tyzb))
      (prin1)
;;;;写字: PCB板钻孔文件为FN;;;;;;;;
(setq Txt (strcat "PCB板钻孔文件为" FN "P.NC"))
(entmake (list      
               (cons 0 "TEXT")
                         (cons 100 "AcDbEntity")
                         (cons 100 "AcDbTexe")
               (cons 62 6);颜色粉红
                         (cons 10 Tzb)
                         (cons 40 (/ R_c 3));字高2.5
               (cons 7"standard")
               (cons 1Txt)
                     )
)
)

xiaolong1487 发表于 2018-4-22 08:38:16

看一下是不是你想要的
(defun c:db(/ a en endata entype file2 file3 i m n pt x y)
        (setvar "cmdecho" 0)
        (setq file2 (strcat "c:/Nc/"(vl-string-right-trim ".dwg"(getvar "DWGNAME")) "P.nc"))
        (setq file3(open file2 "w"))
        (if(= file3 nil)
                (progn
      (alert"路径或文件名错误!")
      (exit)
                )
        )
(princ "请选择要钻孔的圆:")
        (setq a (ssget))
        (setq n (sslength a))
        (setq i 0 m 0)
        (repeat n
                (setq en(ssname a i))
                (setq endata(entget en))
                (setq entype(cdr (assoc 0 endata)))
                (if(= entype "CIRCLE")
      (progn
                                (setq x(cadr(assoc 10 endata)))
                                (setq y(caddr(assoc 10 endata)))
                                (princ "X" file3)
                                (princ (rtos x 2 3) file3)
                                (princ "" file3)
                                (princ "Y" file3)
                                (princ (rtos y 2 3) file3)
                                (princ "\n" file3)
                                (setq m (+ 1 m))
      )
                )
                (setq i (+ 1 i))
        )
        (princ (strcat "\n共有<" (itoa m) ">孔被选取!"))
        (close file3)
        (if (setq pt (getpoint "\n文字放置点: "))
                (entmakeX (list '(0 . "TEXT") (cons 1 (strcat (vl-string-right-trim ".dwg"(getvar "DWGNAME")) "P.nc")) (cons 10 pt) (cons 40 5) (cons 62 1)))
        )
        (prin1)
)


Andyhon 发表于 2018-4-19 17:36:57

Ref:vl-string->*

tungtat 发表于 2018-4-20 13:38:51

Andyhon 发表于 2018-4-19 17:36
Ref:vl-string->*

本人不懂写程式,只会用cad而已。能否帮改下。

ntwison 发表于 2018-4-20 18:08:01

C:\NC\dwg文件名的数字+p.NC
重点是你的dwg文件名有规则吗?
PCB1234MT.dwg
是前面3个字母中间4个数字,最后再来2个字母这样的命名格式吗?如果是的话就好实现点

tungtat 发表于 2018-4-21 08:14:04

ntwison 发表于 2018-4-20 18:08
C:\NC\dwg文件名的数字+p.NC
重点是你的dwg文件名有规则吗?
PCB1234MT.dwg


有,都是规则的。都是 字母+数字+字母.dwg,只要取数字+p.nc 即可。

linheyuanpcb 发表于 2018-4-21 10:49:54

(setq w2(substr(getvar "dwgname")1 (-(strlen (getvar "dwgname")) 9)));取文件名
(setq dir(getvar "dwgprefix"))
(setq w3 (strcat dir w2 ".dxf" ))
(setq w4 (strcat "p:/" w2 ".dxf" ))
(command "dxfout" w3 "o" pt1 pt2 "" "v" "r12" "")
(command "dxfout" w4 "o" pt1 pt2 "" "v" "r12" "")

可以参考一下

tungtat 发表于 2018-4-21 17:31:04

linheyuanpcb 发表于 2018-4-21 10:49
(setq w2(substr(getvar "dwgname")1 (-(strlen (getvar "dwgname")) 9)));取文件名
(setq dir(getvar " ...

(defun c:db()
   (setvar "cmdecho" 0)
   (setq file2(substr(getvar "dwgname") (-(strlen (getvar "dwgname")) 9)))
   (setq w4 (strcat "c:\\NC\\" file2 "p.nc" ))
   (setq w5 (strcat "PCB钻孔文件为" file2 "p.nc" ))
   (setq file3(open w4 "w"))
   (if(= file3 nil)
      (progn
      (alert"路径或文件名错误!")
      (exit)
      )
      )
(princ "请选择要钻孔的圆:")
   (setq a (ssget))
   (setq n (sslength a))
   (setq i 0 m 0)
   (repeat n
   (setq en(ssname a i))
   (setq endata(entget en))
   (setq entype(cdr (assoc 0 endata)))
   (if(= entype "CIRCLE")
      (progn
       (setq x(cadr(assoc 10 endata)))
       (setq y(caddr(assoc 10 endata)))
       (princ "X" file3)
       (princ (rtos x 2 3) file3)
       (princ "" file3)
       (princ "Y" file3)
       (princ (rtos y 2 3) file3)
       (princ "\n" file3)
       (setq m (+ 1 m))
      )
   )
   (setq i (+ 1 i))
   )
(princ (strcat "\n共有<" (itoa m) ">孔被选取!"))
(close file3)
(setq p1 (getpoint "\n请指定文字输出坐标的点:"))
(command "text" p1 "3" "0" w5 "")
(prin1)
)

这样只是取全部文件名了,不知要如何才能取数字呢?另有一点我要是另外写文件名要怎么写(如dwg文件是 " PCB1234MT.dwg"正常程式是自动输出为1234p.nc,如因不确定需输出为 2333 p.nc又要如何写程式)? 先申明本人确实不懂lisp的开发。

Andyhon 发表于 2018-4-21 17:53:06

   (setq file2 (substr(getvar "dwgname") (-(strlen (getvar "dwgname")) 9) 4))
   (setq w4 (strcat "C:\\NC\\" file2 "P.nc" ))

Andyhon 发表于 2018-4-21 18:16:59

(setq file7 (getstring (strcat "\nDefault-->" file2 " OK?")))
(cond
((= file7 ""))
((= file7 file2))
(T (setq file2 file7))
)
(setq w4 (strcat "C:\\NC\\" file2 "P.NC"))
页: [1] 2
查看完整版本: CAD转钻孔帮忙修改