기존에 사용하던 리습에서 다른 타입의 블럭을 만들어서 추가적으로 리습을 만들었는데 그뒤로 오류: 잘못된 인수 유형: stringp nil이란 문구가 뜨고 안되는데 뭐가 잘못된건지 모르겠어요
기존에 사용하던 리습이 될때도 있고 어떤땐 안되고 작업할때 많이 쓰는 리습인데 안되니 너무 불편해요
도움주실수 있을까요?
(defun c:fg(/ *error* ks_variant->list ks_pt_sort dst
acDoc acSpc obj len ptLst ro L L2 len2 lnss blss n wid obj pt blnm rep lst hp1 tmp)(vl-load-com)
(defun *error* (msg)(princ “nerror:”)(princ msg)
(setvar ‘nomutt 0)
(princ)
)
(defun ks_variant->list (val)
(vlax-safearray->list(vlax-variant-value val))
)
(defun ks_pt_sort(L)
(vl-sort(vl-sort L ‘(lambda (a b)(< (car a)(car b)))) ‘(lambda (a b)(< (cadr a)(cadr b))))
)
(setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
(setq acSpc (vlax-get acDoc (if (= 1 (getvar ‘CVPORT)) ‘paperspace ‘modelspace)))
(setvar ‘nomutt 1)
(princ “n기준선을 선택하세요”)
(setq lnss(ssget “:S:E” (list(cons 0 “LINE”))))
(if lnss
(progn
(setvar ‘nomutt 0)
(setq hp1(getpoint “n헤드방향 선택:”))
(setq obj(vlax-ename->vla-object(ssname lnss 0)))
(setq p1(ks_variant->list (vla-get-startpoint obj)))
(setq p2(ks_variant->list (vla-get-endpoint obj)))
(setq len (- (vla-get-length obj) 650)) ;라인 전체길이에서 헤드최소 사이즈를 뺍니다~!!
(if(< (distance p1 hp1)(distance p2 hp1))
(progn (setq ro (angle p2 p1) tmp p1 p1 p2 p2 tmp))
(setq ro (angle p1 p2))
)
(setvar ‘nomutt 0)
(setq L ‘(“ST YJ-0.215” “ST YJ-0.645” “ST YJ12-1.075” “ST YJ12-2.365” “ST YJ12-4.085”
“ST YJ12-6.235” “ST YJ12-8.385” “ST YJ12-10.535” “ST YJ-0.323”)
) ;; 블럭이름리스트 위에처럼 따옴표로 감싸서 블럭이름 계속추가 가능합니다 헤더(잭)은 넣지 마세요
(foreach x L
(setq pos(vl-string-position (ascii “-“) x nil T))
(setq num(* 1000(atof (substr x (+ 2 pos)))))
(setq Lst(cons (list num x)Lst))
)
(setq Lst(vl-sort Lst ‘(lambda (a b)(> (car a)(car b)))))
(setq n 0 L2 nil)
(foreach e Lst
(setq len2 (car e))
(while (< len2 len)
(setq n(1+ n))
(setq len2 (+ len2 (car e)))
)
(setq len (- len (- len2 (car e))))
(setq L2(append L2(list(append e (list n)))))
(setq n 0 )
)
(foreach e L2
(setq blnm(cadr e))
(setq rep(caddr e))
(repeat rep
(vlax-invoke acSpc ‘insertblock p1 blnm 1.0 1.0 1.0 ro)
(setq p1(polar p1 ro (car e)))
)
)
(setq dst (distance p1 p2))
(if (< 810 dst) ; 남은라인길이에 상관없이 헤드 최대크기에 맞춤
(setq p2(polar p2 (+ pi ro)(- dst 810)))
)
(vlax-invoke acSpc ‘insertblock p1 “단축식유압잭2” 1.0 1.0 1.0 ro)
(vlax-invoke acSpc ‘insertblock p2 “단축식유압잭1” 1.0 1.0 1.0 ro)
(vla-erase obj) ;선택한 라인을 없애는 구문입니다 필요없으시면 삭제하세요
)
)
(princ)
)
이게 기존에 쓰던 리습인데 여기서 라인 전체길이에 맞게 블럭이 들어가야 해서 단축식유압잭 문구를 지우고 블럭명을 새롭게 지정해줬는데 안되네요
(defun c:fw(/ *error* ks_variant->list ks_pt_sort dst
acDoc acSpc obj len ptLst ro L L2 len2 lnss blss n wid obj pt blnm rep lst hp1 tmp)(vl-load-com)
(defun *error* (msg)(princ “nerror:”)(princ msg)
(setvar ‘nomutt 0)
(princ)
)
(defun ks_variant->list (val)
(vlax-safearray->list(vlax-variant-value val))
)
(defun ks_pt_sort(L)
(vl-sort(vl-sort L ‘(lambda (a b)(< (car a)(car b)))) ‘(lambda (a b)(< (cadr a)(cadr b))))
)
(setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
(setq acSpc (vlax-get acDoc (if (= 1 (getvar ‘CVPORT)) ‘paperspace ‘modelspace)))
(setvar ‘nomutt 1)
(princ “n기준선을 선택하세요”)
(setq lnss(ssget “:S:E” (list(cons 0 “LINE”))))
(if lnss
(progn
(setvar ‘nomutt 0)
(setq hp1(getpoint “n방향 선택:”))
(setq obj(vlax-ename->vla-object(ssname lnss 0)))
(setq p1(ks_variant->list (vla-get-startpoint obj)))
(setq p2(ks_variant->list (vla-get-endpoint obj)))
(if(< (distance p1 hp1)(distance p2 hp1))
(progn (setq ro (angle p2 p1) tmp p1 p1 p2 p2 tmp))
(setq ro (angle p1 p2))
)
(setvar ‘nomutt 0)
(setq L ‘(“WA YJ-0.215” “WA YJ-0.645” “WA YJ12-1.075” “WA YJ12-2.365” “WA YJ12-4.085”
“WA YJ12-6.235” “WA YJ12-8.385” “WA YJ12-10.535” “WA YJ-0.323”)
) ;; 블럭이름리스트 위에처럼 따옴표로 감싸서 블럭이름 계속추가 가능합니다
(foreach x L
(setq pos(vl-string-position (ascii “-“) x nil T))
(setq num(* 1000(atof (substr x (+ 2 pos)))))
(setq Lst(cons (list num x)Lst))
)
(setq Lst(vl-sort Lst ‘(lambda (a b)(> (car a)(car b)))))
(setq n 0 L2 nil)
(foreach e Lst
(setq len2 (car e))
(while (< len2 len)
(setq n(1+ n))
(setq len2 (+ len2 (car e)))
)
(setq len (- len (- len2 (car e))))
(setq L2(append L2(list(append e (list n)))))
(setq n 0 )
)
(foreach e L2
(setq blnm(cadr e))
(setq rep(caddr e))
(repeat rep
(vlax-invoke acSpc ‘insertblock p1 blnm 1.0 1.0 1.0 ro)
(setq p1(polar p1 ro (car e)))
)
)
(setq dst (distance p1 p2))
(if (< 0 dst) ; 남은라인길이에 상관없이 최대크기에 맞춤
(setq p2(polar p2 (+ pi ro)(- dst 0)))
)
(vla-erase obj) ;선택한 라인을 없애는 구문입니다 필요없으시면 삭제하세요
)
)
(princ)
)
이렇게 바꾼건데 뭐가 부족하거나 잘못된걸까요?