거리산출 리습 소수점 수정 부탁드립니다.
컨텐츠 정보
- 283 조회
- 2 댓글
- 0 추천
- 0 비추천
- 목록
본문
안녕하세요.
많이들 쓰시는 리습인데 물량을 산출할때 0.5단위로 끊어서 산출서에 표현을 하고싶은데
초보라 힘드네요.
지금 리습은 소숫점이 길이대로 나오는데 0.5단위로 반올림 하여 표시되도록 수정 부탁드리겠습니다.
예) 현재 1.6+0.7+2.4+…
수정 2+1+2.5+…
붉은색 부분을 수정하면 될것 같은데 아무리 해봐도 오류만 나네요…부탁드리겠습니다~~
;┌───────────────────────────────────────────────────────┐
;│■ 클릭한 두 점 사이의 거리를 구하고 최종 결과값을 출력하는 프로그램 │
;│ ▶ 소숫점의 수치가 0.2 이하인 경우 내림으로 하고 0.8 이상인 경우 올림으로 함 │
;│ 하지만 1보다 작은 0.2 즉, 200mm 이하인 경우 0으로 할수는 없으므로 그대로 0.2로 출력되게 함 │
;│ ▶ 총거리의 합이 나타날 위치를 클릭하면 구간별 거리값을 나타낸 문자의 1.5배 크기로 출력됨 │
;└───────────────────────────────────────────────────────┘
(defun C:DD1(/ !layer !addtext !end !pt1 !pt2 !dist !text !sum !TextSize !ssadd)
(setq !layer "라인거리산출")
(if (tblsearch "layer" !layer)
(setvar "clayer" !layer)
(command "layer" "m" !layer "c" 7 !layer "")
)
(command "-style" "거리" "hy울릉도m" 0 1 0 "n" "n") ; 스타일 작성
(setq !addtext "" !end "N" !sum 0 !TextSize (getvar "userr1″) !ssadd (ssadd))
(if (= !TextSize 0)
(setq !TextSize (getreal (strcat "n문자 크기를 입력하세요<" (rtos (getvar "userr1″)) ">: ")))
)
(setvar "userr1″ !TextSize)
(while (= !end "N")
(initget 128)
(setq !pt1 (getpoint (strcat "n문자 크기<" (rtos (getvar "userr1″)) "> / 시작점: ")))
(if (= 'STR (type !pt1))
(progn
(setq !TextSize (atof !pt1))
(setvar "userr1″ !TextSize)
(setq !pt1 (getpoint "n시작점: "))
)
)
(setq !pt2 (getpoint !pt1 "n다음점: "))
(while !pt2
(setq !dist (distance !pt1 !pt2))
(setq !text (rtos (/ !dist 1000.0) 2 1))
(if (<= (rem (atof !text) 1) 0.2) ; 소숫점 이하 수치가 0.2보다 작거나 같을 경우
(progn
(if (<= (atof !text) 0.2) ; 원래값이 0.2보다 작거나 같은 경우 0으로 하면 안되므로
(setq !text (rtos (atof !text) 2 1)) ; 구해진 값 그대로 출력되게 함
(setq !text (rtos (atof !text) 2 0)) ; 나머지의 경우에는 수치를 잘라 정수로 만듬(내림 효과)
)
(setq !addtext (strcat !addtext "+" !text))
)
(if (>= (rem (atof !text) 1) 0.8) ; 소숫점 이하 수치가 0.8보다 크거나 같을 경우
(progn
(setq !text (rtos (+ (atoi !text) 1) 2 0)) ; 소숫점 이하 수치를 자르고 1을 더해 정수로 만듬(올림 효과)
(setq !addtext (strcat !addtext "+" !text))
)
(setq !addtext (strcat !addtext "+" !text)) ; 위 두 가지 경우에 해당되지 않을 경우 소숫점 이하까지 구함
)
)
(command "text" "m" (@polar !pt1 (@angle !pt1 !pt2) (/ !dist 2)) !TextSize 0 !text)
(command "line" !pt1 !pt2 "")
(setq !ssadd (ssadd (entlast) !ssadd))
(setq !sum (+ !sum (atof !text)))
(setq !pt1 !pt2)
(setq !pt2 (getpoint !pt1 "n다음점: "))
)
(setq !end (strcase (getstring "종료할까요?(Y/N) : ")))
(if (= !end "")
(progn
(setq !end "N")
(command "pedit" (entlast) "y" "j" !ssadd "" "w" (/ !TextSize 10.0) "x") ; line을 pline 객체로 바꾸고 두께를 문자 크기의 10분의 1로 변경함
(setq !ssadd (ssadd))
)
)
)
(command "pedit" (entlast) "y" "j" !ssadd "" "w" (/ !TextSize 10.0) "x")
(command "text" (getpoint "n결과값을 출력할 위치를 클릭하세요: ") (* !TextSize 1.5) 0 (strcat (rtos !sum 2 2) " = " (substr !addtext 2)))
)
관련자료
상큼메론90님의 댓글
아무도 댓글을 다는 분이 없어서, 그냥 지나가려다가 몇자 적고 갑니다.
리습을 올리시려면, 전부를 올려주세요. 일부만 올리면 리습 테스트를 해 볼 수가 없어요.
질문내용중에
@polar , @angle , 등등등 <— 이런 함수관련 된 내용들이 질문에 다 빠져있어요
그리고 질문에서 예를 든것. 예) 현재 1.6+0.7+2.4+… 수정 2+1+2.5+… <— 이것은 소숫점 한자리 라는 말같은데 2.5 정체는 뭐예요?
아래 참고해 보세요.
(defun C:DD1 (/ !addtext !end !pt1 !pt2 !dist !text !sum !TextSize !ssadd) (setq !layer "라인거리산출") (if (tblsearch "layer" !layer) (setvar "clayer" !layer) (command "-layer" "m" !layer "c" 7 !layer "") ) (command "-style" "거리" "hy울릉도m" 0 1 0 "n" "n") ; 스타일 작성 (setq !addtext "" !end "N" !sum 0 !TextSize (getvar "userr1″) !ssadd (ssadd)) (if (= !TextSize 0) (setq !TextSize (getreal (strcat "nt문자 크기를 입력하세요<" (rtos (getvar "userr1″)) ">: "))) ) (setvar "userr1″ !TextSize) (while (= !end "N") (initget 128) (setq !pt1 (getpoint (strcat "nt문자 크기<" (rtos (getvar "userr1″)) "> / 시작점: "))) (if (= 'STR (type !pt1)) (progn (setq !TextSize (atof !pt1)) (setvar "userr1″ !TextSize) (setq !pt1 (getpoint "nt시작점: ")) ) ) (setq !pt2 (getpoint !pt1 "nt다음점: ")) (while !pt2 (setq !dist (distance !pt1 !pt2)) ;(setq !text (rtos (/ !dist 1000) 2 1)) (setq !text (rtos (+ (/ !dist 1000) 0.5) 2 0)) ; 여기서 0.5를 더합니다. (setq !addtext (strcat !addtext "+" !text)) (command "text" "m" (@polar !pt1 (@angle !pt1 !pt2) (/ !dist 2)) !TextSize 0 !text) (command "line" !pt1 !pt2 "") (setq !ssadd (ssadd (entlast) !ssadd)) (setq !sum (+ !sum (atof !text))) (setq !pt1 !pt2) (setq !pt2 (getpoint !pt1 "nt다음점: ")) ) (setq !end (strcase (getstring "종료할까요?(Y/N) : "))) (if (= !end "") (progn (setq !end "N") (command "pedit" (entlast) "y" "j" !ssadd "" "w" (/ !TextSize 10.0) "x") ; line을 pline 객체로 바꾸고 두께를 문자 크기의 10분의 1로 변경함 (setq !ssadd (ssadd)) ) ) ) (command "pedit" (entlast) "y" "j" !ssadd "" "w" (/ !TextSize 10.0) "x") (command "text" (getpoint "n결과값을 출력할 위치를 클릭하세요: ") (* !TextSize 1.5) 0 (strcat (rtos !sum 2 0) " = " (substr !addtext 2))) )
;;