반복적인 비교구문 구성방법문의
컨텐츠 정보
- 287 조회
- 5 댓글
- 0 추천
- 0 비추천
- 목록
본문
(if(and(>= len 30800)(<= len 30900))
(progn
(setq t1 0.0167)) ; 1/60
(progn
(if(and(>= len 41100)(<= len 41200)))
(progn
(setq t1 0.0125)) ; 1/80
(progn
(if(and(>= len 51400)(<= len 51500)))
(progn
(setq t1 0.0100)) ; 1/100
(progn
(if(and(>= len 61700)(<= len 61800)))
(progn
(setq t1 0.0083)) ; 1/120
(progn
(if(and(>= len 77100)(<= len 77200)))
(progn
(setq t1 0.0067)) ; 1/150
(progn
(if(and(>= len 102800)(<= len 102900)))
(progn
(setq t1 0.0050)) ; 1/200
(progn
(if(and(>= len 154300)(<= len 154400)))
(progn
(setq t1 0.0033)) ; 1/300
(progn
(if(and(>= len 308600)(<= len 308700)))
(progn
(setq t1 0.0017)) ; 1/600
(progn
(setq t1 1))
)
초보입니다. 위리습과 같이
도각의 대각선길이len 값을 입력받아서 그값을 가지고
스케일 t1 값을 찾는 리습을 구성하고 있습니다.
위와 같이 구성하니깐 에러가 뜨네요
다른 좋은 방법이 있을까요?
len 값을 분석해서 스케일t1을 정할수 있는 리습구성 방법 좀 알려주세요
감사합니다.
관련자료
xcsh님의 댓글
님의 의도를 모르는 이상 코트의 일부만 올리시면 조언의 범위도 좁아집니다. 질문부분은 지금 처럼 필요부분만 올리는 것이 좋지만 전체적인 상황인 도면에서 작업방법에 관한 간략한 설명을 하는 것이 좋습니다.
님의 if문 처리형태를 보아서는 t1값은 축소를 위한 값으로 보이고 A3 용지인 420*297 (대각선 값 514.4016) 배수값에 1%이하의 범위로 보입니다.
;———————————————————————————– 다른 분들이 말 씀하신 대로 if문대신 cond문을 쓰는 것이 바람직해 보입니다.
1, 님의 문장 줄을 이동하고 제 방식으로 정리한 것과 비교해 보시죠
(if (and (>= len 30800) (<= len 30900)) (progn (setq t1 0.0167)) ; 1/60 (progn (if (and (>= len 41100) (<= len 41200)) (progn (setq t1 0.0125)) ; 1/80 (progn (if (and (>= len 51400) (<= len 51500)) (progn (setq t1 0.0100)) ; 1/100 (progn (if (and (>= len 61700) (<= len 61800)) (progn (setq t1 0.0083)) ; 1/120 (progn (if (and (>= len 77100) (<= len 77200)) (progn (setq t1 0.0067)) ; 1/150 (progn (if (and (>= len 102800)(<= len 102900)) (progn (setq t1 0.0050)) ; 1/200 (progn (if (and (>= len 154300)(<= len 154400)) (progn (setq t1 0.0033)) ; 1/300 (progn (if (and (>= len 308600)(<= len 308700)) (progn (setq t1 0.0017)) ; 1/600 (progn (setq t1 1)) ; 1/1 )) )) )) )) )) )) )) ) 님이 사용한 코드는 괄호를 많이 닫아야 합니다. ;———————————————————————————– 2, 님의 if문은 한줄수행이므로 progn이 필요하지 않은 것 같습니다. (if (and (>= len 30800) (<= len 30900)) (setq t1 0.0167) ; 1/60 (if (and (>= len 41100) (<= len 41200)) (setq t1 0.0125) ; 1/80 (if (and (>= len 51400) (<= len 51500)) (setq t1 0.0100) ; 1/100 (if (and (>= len 61700) (<= len 61800)) (setq t1 0.0083) ; 1/120 (if (and (>= len 77100) (<= len 77200)) (setq t1 0.0067) ; 1/150 (if (and (>= len 102800)(<= len 102900)) (setq t1 0.0050) ; 1/200 (if (and (>= len 154300)(<= len 154400)) (setq t1 0.0033) ; 1/300 (if (and (>= len 308600)(<= len 308700)) (setq t1 0.0017) ; 1/600 (setq t1 1) ; 1/1 )))))))) 그래도 괄호가 많네요. ;———————————————————————————– 3, 님의 if문은 꼭 연결할 필요는 없으므로 먼저 기본값을 넣고 (setq t1 1) ; 1/1 (if (and (>= len 30800) (<= len 30900)) (setq t1 0.0167)) ; 1/60 (if (and (>= len 41100) (<= len 41200)) (setq t1 0.0125)) ; 1/80 (if (and (>= len 51400) (<= len 51500)) (setq t1 0.0100)) ; 1/100 (if (and (>= len 61700) (<= len 61800)) (setq t1 0.0083)) ; 1/120 (if (and (>= len 77100) (<= len 77200)) (setq t1 0.0067)) ; 1/150 (if (and (>= len 102800)(<= len 102900)) (setq t1 0.0050)) ; 1/200 (if (and (>= len 154300)(<= len 154400)) (setq t1 0.0033)) ; 1/300 (if (and (>= len 308600)(<= len 308700)) (setq t1 0.0017)) ; 1/600 한줄씩 처리할 경우 기본값이 앞에 들어가게 됩니다. ;———————————————————————————– 4. 다른분들이 권장하는 cond는 (cond ((and (>= len 30800) (<= len 30900)) (setq t1 0.0167)) ; 1/60 ((and (>= len 41100) (<= len 41200)) (setq t1 0.0125)) ; 1/80 ((and (>= len 51400) (<= len 51500)) (setq t1 0.0100)) ; 1/100 ((and (>= len 61700) (<= len 61800)) (setq t1 0.0083)) ; 1/120 ((and (>= len 77100) (<= len 77200)) (setq t1 0.0067)) ; 1/150 ((and (>= len 102800)(<= len 102900)) (setq t1 0.0050)) ; 1/200 ((and (>= len 154300)(<= len 154400)) (setq t1 0.0033)) ; 1/300 ((and (>= len 308600)(<= len 308700)) (setq t1 0.0017)) ; 1/600 (t (setq t1 1)) ) if문과 별다르지 않지만 간단 합니다. 마지막 줄에 기본값을 넣어주는 것만 알면 됩니다. ;———————————————————————————– 5. 게다가 님의 판별 범위는 너무 좁아서 끊어져 있습니다. 대각선 길이가 36008(1/70 축척)이라면 지금은 1/1로 됩니다. ( 308700보다 큰값도 1/1로 나오게 됩니다.) 앞에 범위의 마지막 값이 다음범위의 초기값으로 설정해서 빈곳을 없애야 합니다. 예외 사항에 대한 처리도 넣으면 좋겟죠.
(cond ((and (< 0 len)(<= len 30800)) (setq t1 0.0167)) ; 1/1 ((and (< 30800 len)(<= len 30900)) (setq t1 0.0167)) ; 1/60 ((and (< 30900 len)(<= len 41200)) (setq t1 0.0125)) ; 1/80 ((and (< 41200 len)(<= len 51500)) (setq t1 0.0100)) ; 1/100 ((and (< 51500 len)(<= len 61800)) (setq t1 0.0083)) ; 1/120 ((and (< 61800 len)(<= len 77200)) (setq t1 0.0067)) ; 1/150 ((and (< 77200 len)(<= len 102900)) (setq t1 0.0050)) ; 1/200 ((and (< 102900 len)(<= len 154400)) (setq t1 0.0033)) ; 1/300 ((and (< 154400 len)(<= len 308700)) (setq t1 0.0017)) ; 1/600 (t (PRINT "축척값이 지정된 범위를 넘었습니다.") (exit)) ; 실행중단 ) ;———————————————————————————–
참고로 저는 모든 축척에 대해 사용하려고 여러줄의 if문대신 축척비율 리스트 값을 만들고 작은 값을 차례로 제거하는 방법을 사용하고 있습니다.