三维圆拟合LISP不再是w
大家好,我们目前在C3D2016中使用3D Circle Fit LISP来报告测量的法兰面,但注意到,由于我们将模板单元设置修改为从北顺时针读取,Circle Fit例程不再按预期工作,而是以正确的大小绘制圆,但角度似乎是随机的。我不确定这个文件是从哪里来的,因为它没有包含在代码中,再也无法在网上找到,并且比为我们工作的任何CAD人员都要过时。这个文件很可能是内部开发的,因为我们还有其他较旧的程序是内部编写的
如果有人能看一看,看看他们是否能看到是什么导致了它;或者甚至为我们指出一个不同的圆拟合LISP,这将不胜感激。我看不出是什么原因造成的,因为我不知道角度单位设置和UCS之间的联系,而且这个程序似乎只是在不同的UCS处绘制多个圆来拟合每个3点圆,然后平均这些圆以获得最佳拟合圆。
(defun rtd (r)
(/ (* r 180.0) pi))
(defun dtr (d)
(/ (* d pi) 180.0))
(defun c:3dcf (/ OSM)
(setvar "cmdecho" 0)
(setq OSM (getvar "osmode"))
(setvar "osmode" 8)
(command "ucs" "w")
(setq all_pn nil)
(while (setq cir_pn(getpoint "\nGet circle points (Enter when finished): "))
(setq all_pn(append all_pn(list cir_pn)))
)
(setvar "osmode" 0)
(command "ucsicon" "off")
(setq loop_pn all_pn)
(setq radii nil)
(setq verts nil)
(setq wcents nil)
(setq len_all (length all_pn))
(repeat len_all; Draw circles from each set of 3 points in list
(setq w1_p (car loop_pn))
(setq w2_p (cadr loop_pn))
(setq w3_p (caddr loop_pn))
(setq w3_pall (cddr loop_pn))
(command "ucs" "3P" w1_p w2_p w3_p)
(setq u1_p (trans w1_p 0 1)) ; Convert each to local ucs.
(setq u2_p (trans w2_p 0 1))
(setq u3_p (trans w3_p 0 1))
(command "circle" "3p" u1_p u2_p u3_p)
(setq circ_1 (entlast))
(command "ucs" "w")
(command "ucs" "za" w1_p w2_p)
(setq l1_p (trans w1_p 0 1))
(setq l2_p (trans w2_p 0 1))
(setq l3_p (trans w3_p 0 1))
(command "ucs" "z" l1_p l3_p)
(setq uc1_p (trans w1_p 0 1))
(setq uc2_p (trans w2_p 0 1))
(setq u3_pall nil)
(foreach wp_n w3_pall
(setq ucs_t (trans wp_n 0 1))
(setq u3_pall (append u3_pall (list ucs_t)))
)
(setq u3_angs nil)
(foreach a3 u3_pall
(setq ucs_a3 (rtd (angle uc1_p a3)))
(cond
((>= ucs_a3 270)(setq ucs_a3 (- ucs_a3 360)))
((and (>= ucs_a3 90)(< ucs_a3 270))(setq ucs_a3 (- ucs_a3 180)))
)
(setq u3_angs (append u3_angs (list ucs_a3)))
)
(setq u3_len(length u3_angs))
(setq u3_mean (/ (apply '+ u3_angs) u3_len))
(command "rotate" circ_1 "" uc1_p u3_mean)
(setq st_circ (entget circ_1))
(setq v1 (cdr(assoc 210 st_circ)))
(setq v_pl1 v1)
(setq verts (append verts(list v_pl1)))
(setq c1 (cdr(assoc 10 st_circ)))
(setq c1w (trans c1 v1 0))
(setq wcents (append wcents(list c1w)))
(setq r1 (cdr(assoc 40 st_circ)))
(setq radii (append radii(list r1)))
(command "erase" "last" "")
(command "ucs" "world")
(setq 1st_loop (car loop_pn))
(setq rest_loop (cdr loop_pn))
(setq loop_pn (append rest_loop (list 1st_loop)))
)
(setq divi (list len_all len_all len_all))
(setq new_rad (/ (apply'+ radii) len_all))
(setq v1_b (car verts))
(setq verts_1 verts)
(setq cvt_2 (list 0 0 0))
(setq mis_1 (list -1 -1 -1))
(repeat len_all
(setq v1_n (car verts_1))
(setq v1_d (mapcar'- v1_n v1_b))
(setq v1_d1 (car v1_d))
(setq v1_d2 (cadr v1_d))
(setq v1_d3 (caddr v1_d))
(cond
((> v1_d1 1.0)(setq v1_n(mapcar'* v1_n mis_1)))
((< v1_d1 -1.0)(setq v1_n(mapcar'* v1_n mis_1)))
((> v1_d2 1.0)(setq v1_n(mapcar'* v1_n mis_1)))
((< v1_d2 -1.0)(setq v1_n(mapcar'* v1_n mis_1)))
((> v1_d3 1.0)(setq v1_n(mapcar'* v1_n mis_1)))
((< v1_d3 -1.0)(setq v1_n(mapcar'* v1_n mis_1)))
)
(setq cvt_2 (mapcar'+ v1_n cvt_2))
(setq verts_1 (cdr verts_1))
)
(setq new_ver (mapcar'/ cvt_2 divi))
(setq wcents_1 wcents)
(setq wct_2 (list 0 0 0))
(repeat len_all
(setq wct_1 (car wcents_1))
(setq wct_2 (mapcar'+ wct_1 wct_2))
(setq wcents_1 (cdr wcents_1))
)
(setq new_cenw (mapcar'/ wct_2 divi))
(command "vpoint" new_ver)
(command "ucs" "view")
(command "zoom" "previous")
(setq new_cenuc(trans new_cenw 0 1))
(command "circle" new_cenuc new_rad)
(command "ucs" "world")
(setq circ_2 (entlast))
(setq lcirc_2 (entget circ_2))
(command "ucs" "object" "last")
(setq all_errs nil)
(foreach wp_er all_pn
(setq ucs_er (trans wp_er 0 1))
(setq all_errs (append all_errs (list ucs_er)))
)
(foreach zer all_errs
(princ (cddr zer))
)
(setq err_cen (list 0 0 0))
(foreach den all_errs
(princ (fix (- (distance err_cen den) new_rad)))
)
(command "ucs" "w")
(command "ucsicon" "on")
(setvar "cmdecho" 1)
(setvar "osmode" OSM)
(princ "3dcf" )
)
页:
[1]