기존에 command문을 이용한 출력 리습을 만들어 사용 중인데
ucs 변환된 도면에서는 작동하지 않아 관련 변환 구문을 추가하여 사용하고 있었습니다.
최근에 리습 작동 속도를 높이고 싶어 vla-plotToFile / vla-plotToDevice 구문을 이용하게 수정했습니다.
다른 리습에서 vl 관련 코드는 얻어왔구요.
그런데 command문에서는 작동하던 변환구문이 vla-plot을 이용하니 제대로 작동하지가 않습니다.
예상컨대 좌표 변환간에 문제가 발생하는게 아닌가 싶은데 어디가 문제인지를 모르겠어 도움 요청드립니다.
아래는 사용 코드 일부 발췌입니다.
1. 아래 코드를 이용해서 ucs 설정된 도곽 블록 좌표를 wcs 기준으로 환산합니다.
;——————————————
;; Doug C. Broad, Jr.
;; can be used with vla-transformby to
;; transform objects from the UCS to the WCS
(defun UCS2WCSMatrix ()
(vlax-tmatrix
(append
(mapcar
‘(lambda (vector origin)
(append (trans vector 1 0 t) (list origin))
)
(list ‘(1 0 0) ‘(0 1 0) ‘(0 0 1))
(trans ‘(0 0 0) 0 1)
)
(list ‘(0 0 0 1))
)
)
)
;; transform objects from the WCS to the UCS
(defun WCS2UCSMatrix ()
(vlax-tmatrix
(append
(mapcar
‘(lambda (vector origin)
(append (trans vector 0 1 t) (list origin))
)
(list ‘(1 0 0) ‘(0 1 0) ‘(0 0 1))
(trans ‘(0 0 0) 1 0)
)
(list ‘(0 0 0 1))
)
)
)
2. 변환 과정에서 잠긴 레이어가 있으면 잠긴 객체는 내버려두고 변환되어 결과값이 이상해지길래 잠금해제 후 복원하는 구문을 추가했습니다.
;레이어 잠금상태 저장
(defun ls1 (/ )
(setq
layerstates ‘()
lays (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(vlax-for x lays
(setq layerstates (append layerstates (list (cons (vla-get-name x) (vla-get-lock x)))))
(vla-put-lock x :vlax-false)
)
)
;레이저 잠금상태 복원
(defun ls2 (/ )
(vlax-for x lays
(vla-put-lock x (cdr (assoc (vla-get-name x) layerstates)))
)
)
3. help.autodesk에서 vla-getboundingbox로 얻은 좌표를 vla-setwindowtoplot 기능 넣을 수 있는 좌표값으로 변환하는 방법을 시도하다 도저히 안되겠어서 다른데서 얻어온 변환 코드입니다.
(defun List->Safearray (lst) (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length lst)))) lst))
4. 위의 구문들을 이용해서 출력하는 부분 코드입니다.
;———————–
;Original code from 별명없음
;UCS 설정된 도면 출력
(cond
((zerop (getvar ‘worlducs))
(ls1)
(vla-TransformBy vlename (UCS2WCSMatrix))
(vla-getboundingbox vlename ‘min ‘max)
(vla-TransformBy vlename (WCS2UCSMatrix))
(ls2)
)
(t (vla-getboundingbox vlename ‘min ‘max))
)
;———————–
(setq
llp (vlax-safearray->list min)
urp (vlax-safearray->list max)
width (- (car urp) (car llp))
height (- (cadr urp) (cadr llp))
landscape
(cond
((wcmatch (setq cpaper (vla-get-CanonicalMediaName cLay)) (strcat “*” “420.00_x_297.00” “*”)) (if (> width height) ac0degrees ac90degrees))
((wcmatch cpaper (strcat “*” “297.00_x_420.00” “*”)) (if (> width height) ac90degrees ac0degrees))
(t (if (> width height) ac0degrees ac90degrees))
)
papersize (_papersize (distance llp urp)) ;위쪽의 _papersize 함수를 불러옴
plotscale (if (= papersize (fix papersize)) (rtos papersize 2 0) (rtos papersize 2 3))
)
(vla-put-plotrotation cLay landscape)
(vla-put-plottype cLay acWindow)
(setq
min (List->Safearray (list (car llp) (cadr llp)))
max (List->Safearray (list (car urp) (cadr urp)))
)
(vla-SetWindowToPlot cLay min max)
(vla-put-usestandardscale cLay :vlax-false)
(vla-setcustomscale cLay 1 plotscale)
(princ (strcat “nScale = 1:” plotscale “n”))
(vla-PlotToFile cPlot pdfname)
이 코드로 pdf를 만들면 ucs 돌아간 것은 제대로 변환되는데 출력 윈도우 원점을 wcs 0,0에서부터 계산해서 엄한 곳이 출력됩니다. 해결법 아시는 분은 도움 부탁드립니다.
질문 1.
ucs 좌표를 wcs좌표로 바꿔 준다고 되어있는데… 굳이 프로그램을 만들어 트렌스 하고 해야 되나요?
그냥 모든 좌표 원점을 wcs로 하면 안됩니까?
(command “ucs” “”) 이것 한줄로….
질문 2.
papersize (_papersize (distance llp urp)) ;위쪽의 _papersize 함수를 불러옴
_papersize 함수는 어디에 있죠?
1. 가끔 도면이 협력사 다녀오면 ucs가 건드려져 있는 경우가 많아서 그럴때도 추가 설정 없이 작동하게 만드려고 ucs 돌아간 경우를 가정하고 만들었습니다. 그럴 때마다 보이는건 똑같은데 ucs가 먹어져 있어서 빈 화면만 출력되더라구요.
2. 코드 전체를 넣으면 너무 길어지지 않을까 싶어 좌표 변환 관련된 부분만 올렸는데 코드 파일 링크 올립니다.
https://drive.google.com/file/d/1UG_-97ayfg4fzIoES6N9CSNGi3Ejsap9/view
pppp 부분 수정하던 도중 파일이어서 캐드에 들이 부으면 작동 안할거라 테스트 해보시려면 defun c: pppp 파트는 지우셔야 됩니다.
max, min은 리습 예약어 입니다.(녹색 표시 부분은 정상 빨간색 표시 부분은 변수로 수정해야됨)
변수로 사용하면 에러가 발생합니다.
이미지 빨간색 표시 부분에 max, min을 변수로 바꾸고 해보세요.
그리고 프로그램을 완전히 돌려 보지를 못했습니다.
해 보시고 안되면 또 댓글 달아 주세요.
제가 프로그램을 돌려 봤는데 min, max 모두 변경해야 됩니다.
그래서 min은 POINT_min으로
max는 POINT_max로 변경했습니다.
그렇게 해서 하면 프로그램은 정상적으로 돌아 갑니다만….
블럭을 모두 출력을 하는데…출력영역을 어떻게 잡죠?
모두 이상한 영역을 출력합니다.
일딴 파일을 올려야 하는데 여기는 올릴때가 없네요.
메일 주소를 보내주세요.
보내줄께요.
아이고 이제야 봤네요.
-으로 부탁드립니다.
출력장치, 종이사이즈, 펜 종류 리턴받기 함수
프린터 장치, 종이사이즈, 펜종류를 리턴 받을수 있는 함수를 만들어 자료실에 올렸어요.
위 프로그램에 적용하면 괜찮을듯 합니다.
다운받아 사용해보세요.