注册 登录
明经CAD社区 返回首页

highflybir的个人空间 http://www.mjtd.com/?236907 [收藏] [复制] [分享] [RSS]

留言板

facelist doodle涂鸦板

您需要登录后才可以留言 登录 | 注册


shang_123 2012-3-18 11:51
大哥 你那个最小外包圆 改成外包多段线围成的盒子 该怎么改呀! 忘指教!
zwqgdhl 2012-2-2 14:44
highflybir大师,烦请出手相助,能在不打开图形下读词典http://bbs.mjtd.com/forum.php?mod=viewthread&tid=91452&page=1#pid504572pid504572
自贡黄明儒 2012-2-2 11:22
大师,我想画垂线,结果未成功,麻烦你有空帮看看
;;本程序根据highflybird[曲线和块内曲线画切线]改
;;本程序的作用是[曲线和块内曲线画垂线]
;;先是交点,其次是中点和端点
(defun c:t11 (/ ANG BS EN GEOM LST M MODE NORM P0 P1 P2 P3 P4 P5 P6 PP Q TMP V VAL VT ang)
  (vl-load-com)
  ;;1 矢量的点积                                                         
  ;; VXV Returns the dot product of 2 vectors                           
  (defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2)))
  ;;2 矢量转置                                                            
  ;; TRP Transpose a matrix -Doug Wilson-                                
  (defun trp (m) (apply 'mapcar (cons 'list m)))
  ;;3 矢量的矩阵变换                                                      
  ;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
  (defun mxv (m v) (mapcar (function (lambda (r) (vxv r v))) m))
  ;;4 矩阵相乘                                                            
  ;; MXM Multiply two matrices -Vladimir Nesterovsky-                    
  (defun mxm (m q) (mapcar (function (lambda (r) (mxv (trp q) r))) m))
  ;;5 TransNested (gile)
  ;; Translates a point coordinates from WCS or UCS to RCS -coordinates system of a
  ;; reference (xref or block) whatever its nested level-
  ;;
  ;; Arguments
  ;; pt : the point to translate
  ;; rlst : the parents entities list from the deepest nested to the one inserted in
  ;;        current space -same as (last (nentsel)) or (last (nentselp))
  ;; from to : as with trans function: 0 for WCS, 1 for current UCS, 2 for RCS
  (defun TransNested (pt rlst from to)
    (and (= 1 from) (setq pt (trans pt 1 0)))
    (and (= 2 to) (setq rlst (reverse rlst)))
    (and (or (= 2 from) (= 2 to))
         (while rlst
           (setq geom (if (= 2 to)
                        (RevRefGeom (car rlst))
                        (RefGeom (car rlst))
                      )
                 rlst (cdr rlst)
                 pt   (mapcar '+ (mxv (car geom) pt) (cadr geom))
           )
         )
    )
    (if (= 1 to)
      (trans pt 0 1)
      pt
    )
  )
  ;;6 RefGeom (gile)
  ;; Returns a list which first item is a 3x3 transformation matrix (rotation,
  ;; scales, normal) and second item the object insertion point in its parent
  ;; (xref, bloc or space)
  ;;
  ;; Argument : an ename
  (defun RefGeom (ename / elst ang norm mat)
    (setq elst (entget ename)
          ang  (cdr (assoc 50 elst))
          norm (cdr (assoc 210 elst))
    )
    (list (setq mat (mxm (mapcar (function (lambda (v) (trans v 0 norm T)))
                                 '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
                         )
                         (mxm (list (list (cos ang) (- (sin ang)) 0.0)
                                    (list (sin ang) (cos ang) 0.0)
                                    '(0.0 0.0 1.0)
                              )
                              (list (list (cdr (assoc 41 elst)) 0.0 0.0)
                                    (list 0.0 (cdr (assoc 42 elst)) 0.0)
                                    (list 0.0 0.0 (cdr (assoc 43 elst)))
                              )
                         )
                    )
          )
          (mapcar '-
                  (trans (cdr (assoc 10 elst)) norm 0)
                  (mxv mat (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst))))))
          )
    )
  )
  ;;7 RevRefGeom (gile)
  ;; RefGeom inverse function
  (defun RevRefGeom (ename / entData ang norm mat)
    (setq entData (entget ename)
          ang     (- (cdr (assoc 50 entData)))
          norm    (cdr (assoc 210 entData))
    )
    (list (setq mat (mxm (list (list (/ 1 (cdr (assoc 41 entData))) 0.0 0.0)
                               (list 0.0 (/ 1 (cdr (assoc 42 entData))) 0.0)
                               (list 0.0 0.0 (/ 1 (cdr (assoc 43 entData))))
                         )
                         (mxm (list (list (cos ang) (- (sin ang)) 0.0)
                                    (list (sin ang) (cos ang) 0.0)
                                    '(0.0 0.0 1.0)
                              )
                              (mapcar (function (lambda (v) (trans v norm 0 T)))
                                      '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
                              )
                         )
                    )
          )
          (mapcar '-
                  (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 entData)))))
                  (mxv mat (trans (cdr (assoc 10 entData)) norm 0))
          )
    )
  )
  ;;8 主程序
  (setq lst (MC:NENTSEL1 "\n拾取曲线,以便在交点、中点or端点作垂线:"
                         '((0 . "*LINE,ELLIPSE,CIRCLE,ARC,RAY"))
                         "对象必须是曲线或块内曲线。"
            )
  )
  (setq P0 (cadr lst))                                                                              ; 光标点
  (setq en (car lst))                                                                               ; 光标处图元
  (setq lst (nentselp P0))
  (setq p1 (osnap p0 "_int,_mid,_endp"))
  (setq m  (caddr lst)                                                                              ; 变换矩阵
        Bs (cadddr lst)                                                                             ; 块参照列表(可能有嵌套)
        P1 (TransNested P1 Bs 1 2)                                                                  ; 把点变换到图块坐标系
        P1 (vlax-curve-getclosestpointto en P1)                                                     ; 得到最近点
        pp (vlax-curve-getParamAtPoint en P1)                                                       ; 得到这点参数
        vt (vlax-curve-getSecondDeriv en pp)                                                        ; 得到法线
        an (angle '(0 0 0) vt)                                                                      ; 切线角
        P3 (mapcar '+ P1 vt)                                                                        ; 切线端点(RCS)
        P4 (mapcar '- P1 vt)                                                                        ; 切线端点(RCS)
        p2 (TransNested P1 Bs 2 0)                                                                  ; 切点
        P5 (TransNested P3 Bs 2 0)                                                                  ; 切线端点(WCS)
        P6 (transNested P4 Bs 2 0)                                                                  ; 切线端点(WCS)
  )
  (setq ang (angle p5 p6))
  (while (not (or (= mode 3)                                                                        ; 左击
                  (= mode 11)                                                                       ; 右击
                  (= mode 13)                                                                       ; 回车
                  (= mode 32)                                                                       ; 空格
                  (= mode 25)
              )
         )
    (setq mode (car (setq TMP (grread 2)))
          val  (cadr tmp)
    )
    (if (equal (type val) 'LIST)
      (progn (setq p6 (polar p5 ang (distance val p5)))
             (if (> (distance val p6) (distance val p5))
               (progn (setq ang (+ pi ang)) (redraw))
             )
             (grdraw P6 p5 1)
      )
    )
  )
  (redraw)
  (entmake (list '(0 . "LINE") (cons 10 p5) (cons 11 p6)))                                          ; 画垂线
  (princ)
)
;;; 由caoyin的MC:ENTSEL1函数,写MC:NENTSEL1________________________________________________________________自贡黄明儒
;;;  MSG 同entsel,当该参数为nil时,缺省提示信息为“选择对象: ”。
;;;  ERRMAG:选择目标不符合条件时命令行信息。当该参数为nil时,缺省提示信息为"无效的对象。"。
;;;  FIL 同ssget
(defun MC:NENTSEL1 (MSG FIL ERRMSG / E ERR PF RT)
  (setq E  T
        PF (getvar 'PICKFIRST)
  )
  (or ERRMSG (setq ERRMSG "无效的对象。"))
  (setvar 'PICKFIRST 1)
  (while E
    ;;用apply的目的在于当nentsel后面的参数为nil时不会出错。
    (if (setq E (apply 'nentsel (cond (MSG (list MSG)))))
      (cond ((vl-consp E)
             (if (wcmatch (cdr (assoc 0 (entget (car E)))) (cdr (car FIL)))
               (setq RT E
                     E  nil
               )
               (progn (princ ERRMSG) (setq E T))
             )
            )
            (T
             (setq RT E
                   E  nil
             )
            )
      )
      ;; 当ERRNO返回7,表明用户鼠标的拾取点上没有对象,变量E设为T确保while继续。若ERRNO返回52则表明用户右击鼠标放弃选择。
      (cond ((= (setq ERR (getvar 'ERRNO)) 7) (setq E T) (princ "未选择对象。"))
            ((= ERR 52) (setq E nil))
      )
    )
  )
  (setvar 'PICKFIRST PF)
  RT
)
;;; 由caoyin的MC:ENTSEL1函数,写MC:NENTSEL1________________________________________________________________自贡黄明儒
highflybir 2012-1-14 00:04
你把问题贴上来。
shang_123 2012-1-13 23:30
大哥 想请你帮个忙可以吗?
brainstorm 2011-11-24 20:46
测试图纸已经发到highflybird@qq.com
njut_prince 2011-11-21 23:48
能不能帮我写个程序   就是把模型里面的几个图批量生成布局(放在一个布局里面),比如模型里面有3个A3图,把它们批量在布局1里面生成3个视口!秋风的批量打印有这个功能,但是它有几张图就生成几个布局,我想要在一个布局里面   谢谢!QQ70932101
cabinsummer 2011-11-12 09:49
大师,我的圆周率计算程序4000位出错找到原因了。计算没有问题,是最后的字符串输出有问题,LISP只能处理不超过4096个字符的字符串。因此,5位一组,中间加一空格,输出3410位没问题,但3415位一定出错。但表输出超过3415位就没有问题,只是很多数值前面的0不显示,显得各项长短不一不好看。
cabinsummer 2011-11-11 20:11
大师,我的圆周率计算在4000位时出错了,能帮我分析一下吗?
highflybir 2011-11-1 21:21
改进的欧拉公式。
cabinsummer 2011-11-1 21:11
敢问大师的圆周率计算是哪个公式?
gbhsu 2011-9-9 16:32
你的东东高不可攀!
真没有时间研究,相恨见晚哦.
zark 2011-5-14 21:10
欢迎多多发贴哦,你的每贴都是极品
sachindkini 2010-12-22 19:07
highflybir: Hi,friend,
    how are you doing these days?
    Would you make friend with me?
    My MSN is : highflybird@msn.com
    happy in China.
    If you ne ...
dear friend
how r u
sorry for let reply
my email id is
sachindkini@gmail.com
12

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 01:11 , Processed in 0.327297 second(s), 9 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部