점의 좌표가 현재 (513583.8503, 230464.6485) 로 소수점 4째자리인데
이걸 3째자리로 반올림해서 (513583.850, 230464.649)로 이동시키는 기능이나 리습이 있을까요?
units로 표기만 바뀌는게 아니라 실제로 점의 위치가 이동되는 기능이 필요합니다..
비밀번호를 잊으셨나요? 비밀번호를 재설정하려면 이메일 주소를 입력해주세요.
해당 질문을 신고하는 이유를 간단히 입력해주세요.
해당 답변을 신고하는 이유를 간단히 입력해주세요.
해당 유저를 신고하는 이유를 간단히 입력해주세요.
(defun round3 (x)
(/ (float (fix (+ (* x 1000.0) 0.5))) 1000.0))
(defun c:test ( / ent obj pt newpt)
(setq ent (car (entsel “n점 또는 객체를 선택하세요: “)))
(if ent
(progn
(setq obj (vlax-ename->vla-object ent))
(if (vlax-property-available-p obj ‘Coordinates)
(progn
(setq pt (vlax-get obj ‘Coordinates))
(setq newpt
(list
(round3 (car pt))
(round3 (cadr pt))
(if (caddr pt) (round3 (caddr pt)) 0.0)
)
)
(vlax-put obj ‘Coordinates newpt)
(princ (strcat “n이동 완료: “
(rtos (car newpt) 2 3) “, “
(rtos (cadr newpt) 2 3)))
)
(princ “n이 객체는 좌표 변경이 불가능합니다.”)
)
)
)
(princ)
)
(defun RoundTo3 (val / absval fourth trunc sign)
;; 1. 부호 저장
(setq sign (if (>= val 0) 1 -1))
;; 2. 절대값
(setq absval (abs val))
;; 3. 4번째 자리 추출
(setq fourth (fix (- (* absval 10000.0) (* (fix (* absval 1000.0)) 10.0))))
;; 4. 소수점 3자리 버림
(setq trunc (/ (fix (* absval 1000.0)) 1000.0))
;; 5. 반올림 후 부호 적용
(* sign (if (>= fourth 5)
(+ trunc 0.001)
trunc
))
)
(defun c:Rp3 (/ ss cnt i ent pt)
(setq ss (ssget))
(if (= ss nil)
(progn (princ “n선택된 객체가 없습니다.”) (exit))
)
(setq cnt (sslength ss) i 0)
(while (< i cnt)
(setq ent (ssname ss i))
(if (= (cdr (assoc 0 (entget ent))) “POINT”)
(progn
(setq pt (cdr (assoc 10 (entget ent))))
(entmod (subst (cons 10 (list (RoundTo3 (car pt))
(RoundTo3 (cadr pt))
(RoundTo3 (caddr pt))))
(assoc 10 (entget ent))
(entget ent)))
)
)
(setq i (1+ i))
)
(princ “n완료: POINT 좌표 반올림 적용됨”)
(princ)
)
ai도움좀 받아서 했습니다.
그런데 기본함수로 하니 반올림계산이 이상해서 ai못믿겠어서
그냥 무식하게 계산하는 방법으로 해서 만들었습니다.
음수일때 우리가 생각하기에 커져야 하니까 절대값이 작아질줄알았는데
엑셀에서 반올림 테스트를 해보니 부호 무시하고 절대값에서 반올림한다음
부호를 붙여주는 방식이더군요.
그래서 그렇게 적용하였습니다.
명령어는 rp3 이고 , cad의 point 요소 좌표값만 변경해줍니다.