저번주부터 내내 짜는데 너무 안되, 답답해서 도움을 요청드립니다ㅠㅜ
사정상 리습전체를 올리기가 좀 그래서 일부분만 올려드린점 양해부탁드립니다..
일단 최종 실행은
(command “_MOVE” (entlast) “” 1sttip1 (polar 1sttip1 (angle midpt1 nmidpt1) backy))
입니다.
제가 만들고 있는것은 command에서 보시면 nmidpt1인데,
제가 의도하려는걸 쉽게 말씀드리자면
만약 원점이 기준이라면 우측으로 기다란 도형이 0도의 각도로 뽑힐때,
그 도형의 y축 move기준점(nmidpt1)은 긴 도형의90도가 되게 만들고, 저 위에 command에서는 긴 도형에서 해당방향기준으로 무조건 90도로 이동을 시키려는 겁니다.
조건을 더 설명해 드리자면, 만약 도형이 우측으로 길게 뽑히면 센터 가까이 있는 pcen부근을 기준으로
위아래로 움직이게 되어있습니다. 그래서 만약 위로 움직이면 위로 향하는 90도 기준점이 만들어지는거고, 아래로 움직이면 아래를 향하는 -90도 기준점이 만들어 지는겁니다.< 이것이 핵심..
pcenx는 움직이는 축 기준의 x축
pceny는 움직이는 축 기준의 y축
midpt1은 pcen와 동일한 라인인데 약간 옆으로 떨어진 포인트로 보시면 될것 같습니다.
그러니까 우측으로 뽑혔을댄 우측으로 조금 더 옆에 있고, 좌측일땐 좌측으로 좀더 옆으로, 탑일땐
탑쪽으로 더 위치한다고 보시면 됩니다. 선상은 동일합니다.(좌우측은 x가 동일, 위아래는 y가 동일)
midpt3는 움직이는 도형의 끝 축이라고 생각하시면 됩니다.
backy는 해당 빔의 움직이는 방향의 90도로 이동할 거리
dirt은 해당방향이라고 보시면 될것 같습니다.
좀더 부연설명을 해드리자면
ㅁ top
ㅁ
ㅁ
ㅁ
left ㅁㅁㅁㅁㅁㅁㅁ(0,0) ㅁㅁㅁㅁㅁㅁㅁㅁ right
(bottom은 생략..;;)
이렇게 뽑힌다고 생각하시면 되겠습니다..
물론 pcen은 0,0이 아니구요 여러 사분면에 해당됩니다.
아래에 리습은 복붙한거라 아마 top left bottom은 각도에 따른 수정이 있어야 되서 아마 안될거라 생각했는데, right는 뽑으면 나와야되는데, 90도가 아니라 자꾸 180도 즉 반대방향으로 나옵니다 ㅠ
실행하면서 visual lisp 콘솔로 수치 일일이 확인해가면서 하는데 분명 좌표는 맞는데 반대로 자꾸 뜨네요ㅠㅠ
어디가 문제가 있는지 한번 봐주세요ㅠ 문법적으로나 아니면 잘못된 부분이 있는지 확인부탁드립니다ㅠ
첨부는 안되어서 글로 올려드립니다.
;————————————————————————-
;—해당 방향기준으로 90도 각도를 준다. y backing length를 넣는 기준점.—
;————————————————————————-
(cond
(progn
(if (= dirt “Top”);top 방향으로
(progn
(if (> pcenx (car midpt3));x축이 왼쪽 일 경우
(progn
(setq nmidpt1 (list (- (abs (- 2 pcenx))) pceny))))
(if (< pcenx (car midpt3));x축이 오른쪽 일 경우
(progn
(setq nmidpt1 (list (abs (+ 2 pcenx)) pceny))))
)
)
(if (= dirt “bottom”);Bottom 방향으로
(progn
(if (> pcenx (car midpt3));x축이 왼쪽 일 경우
(progn
(setq nmidpt1 (list (- (abs (- 2 pcenx))) pceny))))
(if (< pcenx (car midpt3));x축이 오른쪽 일 경우
(progn
(setq nmidpt1 (list (abs (+ 2 pcenx)) pceny))))
)
)
(if (= dirt “left”);left 방향으로
(progn
(if (> pceny (cadr midpt3));y축이 아래 일 경우
(progn
(setq nmidpt1 (list pcenx (- (abs (- 2 pceny)))))))
(if (< pceny (cadr midpt3));y축이 위 일 경우
(progn
(setq nmidpt1 (list pcenx (abs (+ 2 pceny))))))
)
)
(if (= dirt “Right”);Right 방향으로
(progn
(if (> pceny (cadr midpt3));y축이 아래 일 경우
(progn
(setq nmidpt1 (list pcenx (- (abs (- 2 pceny)))))))
(if (< pceny (cadr midpt3));y축이 위 일 경우
(progn
(setq nmidpt1 (list pcenx (abs (+ 2 pceny))))))
)
)
)
)
글을 쓰다보니 엄청 길어졌네요… 파일첨부안되는점 양해 부탁드리며, 고수님들 부탁드리겠습니다.
(–) (__)
공유
혹시 부연설명이 더 필요하시면 더 말씀드리겠습니다…
(setq 1sttip2
(if (wcmatch (strcase dirt) “TOP,BOTTOM”)
(list
((if (> pcenx (car midpt3)) – +) (car 1sttip1) backy)
(cadr 1sttip1)
)
(list
(car 1sttip1)
((if (> pceny (cadr midpt3)) – +) (cadr 1sttip1) backy)
)
)
)
(command “_MOVE” (entlast) “” 1sttip1 1sttip2)
뭐하남님 답변 감사드립니다.
근데 이해가 안되는게 있어서 몇가지 더 질문 드립니다.
((if (> pcenx (car midpt3)) – +) (car 1sttip1) backy)
여기서 (car 1sttip1) 하고 backy는 무슨 역할인가요?
그리고 if문 뒤에 – +는 어떻게 해석 해야되나요?
그리고 top bottom만 쓴 이유가 left, right도 동일하게 적용하면 되어서 그런거죠?
일단 실행은 해보는데 캐드가 맛이가서 이상하게 나오네요..ㅠ;
두번째 list가 left,right인가요?
네 그렇죠. 쓸데없이 길게할 필요가 없죠.
뭐하남님…
위에서 질문드린
((if (> pcenx (car midpt3)) – +) (car 1sttip1) backy) 이부분 해석이 안되서 그러는데;
설명 부탁드립니다; if문에 넣은 -+와 if뒤에(car 1sttip1) backy은 왜 같이 묶인건지 이해가 되지 않습니다;
그리고 저는 한 포인트를 잡고 그 포인트와 도형이 뿌려진 방향에있는 포인트와 같이 해서 각도를 잡으려고 한건데, 그 포인트를 그냥 임의의 숫자로 2를 넣었는데 그 부분은 올리신 코드에서 어떻게 처리하신건가요?? 그 임의의 숫자가 바뀔때마다 위치에 따라 이동되는 값이 조금씩 달라지고 또 사분면에 따라 조금 씩 다르더라고요..; 이동되는 backy값도 midpt1,midpt3를 이용해서 tan값과 sin값을 계산한것이거든요;
이야기가 좀 샜는데, 코드 해석 부탁드립니다 ㅠ
((if (> pcenx (car midpt3)) – +) (car 1sttip1) backy)
만약, x좌표(car midpt3)가 pcenx보다 작으면 (- (car 1sttip1) backy)
또는 아니면 더하기, polar함수를 쓸필요가 없어서 그리한거입니다.
님이 짜신 코드를 간략하게 줄이고 잘못된 부분을 수정한 겁니다.
그리고 command를 쓸 경우 osnap의 영향을 받으니 그점 유의하시구요.
답변 감사드립니다. (–)(__) 혹시 더 궁금한거 있으면 다시 물어봐도되겠죠?ㅋ;