jeremyw 发表于 2022-7-29 17:30:09

三维圆拟合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]
查看完整版本: 三维圆拟合LISP不再是w