明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: linhui12

TO:"sailorcwx"兄和"xxsheng兄"程序OK,大恩不言谢啦!!!

  [复制链接]
 楼主| 发表于 2008-5-28 12:44:00 | 显示全部楼层

xxsheng兄,您的程序可以用了,辛苦了,谢谢您啊.第20根的确不是平面的一根管,是我看错了.

目前尚有一个问题困饶着我:上面程序能否实现先将空间线上的点旋转,最后再用PL或3DPL线连接画出线呢(即程序最后再执行:command ".3dpoly" ptA ptB ptC ptD "")因为我想获取平放后的PTA,PTB,PTC,PTD的值,要怎么实现?

另:换行的变量为:"DH",如果DH>20即下移一行,DH>40下移两行,DH>60类退...

 楼主| 发表于 2008-5-28 13:18:00 | 显示全部楼层
sailorcwx发表于2008-5-28 11:47:00不知道楼主试过没有用二维多段线实现的就是躺在XY平面或平行XY平面的,不知道楼主是不是要这种效果而用三维多段线实现,还要旋转,太麻烦了

sailorcwx兄,您的思路我不是很理解,如果感兴趣也请您写写看,我也总觉的我的程序写的过于烦琐了,很不简练,主要是我才接触LISP编程,都是靠坛里的兄弟帮忙写的程序原形,我只懂弄一些小修改

我数据的格式为:

1,219,300,3,11567,8720,9970,12323,8720,9970,13013,8030,9970,13365,8030,9970

DH,D1,R,N1,(此后为坐标)

程序最后实现描点:PTA,PTB或PTA,PTB,PTC或PTA,PTB,PTC,PTD画线

发表于 2008-5-28 14:31:00 | 显示全部楼层

帮你简化一步,数据点的读取
(read (strcat "(" (vl-string-translate "," " " data) ")"))

其中data是read-line返回的字符串,剔出第一,第二,第三,第四个元素,剩下的就是顶点坐标了

 楼主| 发表于 2008-5-28 15:27:00 | 显示全部楼层
sailorcwx兄,小弟惭愧,受了您的"渔"却不知如何使用,烦请介绍一下(read (strcat "(" (vl-string-translate "," " " data) ")")),应该替换掉我程序中的哪一部分代码??
 楼主| 发表于 2008-5-29 22:52:00 | 显示全部楼层

如今就差一小步,烦请哪位大虾帮忙编一下:

1."自动换行".变量是"DH",如果DH>20即下移一行且向首移20行,DH>40下移两行且向首移20行,DH>60类推...

2.请xxsheng兄或哪位好心兄弟帮忙改改,令程序先将PTA,PTB,PTC,PTD点放平于XY面,而后再用PL或3DPL将这些点连接,最后输出线(目的是想获取放平后的PTA,PTB,PTC,PTD坐标)

发表于 2008-5-30 08:31:00 | 显示全部楼层
你到底想要什么?
1. (if startp
  (if (zerop(rem dh 20))
      (setq startp (mapcar '+ startp '(4200 3400 0)));;这里的4200和3400,代表x轴和y轴的间距-
      (setq startp (mapcar '+ startp '(4200 0 0)))
    )
  (setq startp '(0 0 0)))
2.本身你的坐标到底怎么得到的?直接从坐标转换也是可以做到的(把rotate3d的步骤生成三维旋转矩阵,坐标点乘矩阵,就是一样了),自己想想怎么作吧.如果想在现在的基础上获得作标点的话,查找下"获得所有顶点"之类的,这里到处都是.
发表于 2008-5-30 08:33:00 | 显示全部楼层
;;哈,不好意思,,应该是y轴减
(if startp
  (if (zerop(rem dh 20))
      (setq startp (mapcar '+ startp '(4200 -3400 0)))
      (setq startp (mapcar '+ startp '(4200 0 0)))
    )
  (setq startp '(0 0 0)))
 楼主| 发表于 2008-5-30 18:16:00 | 显示全部楼层

xxsheng前辈,我本身的坐标就是从模型中提取的,编程的目的是为了出零件的小样图,所以放平后移动到每个方框内的多义先还须另外处理,所以还许获取他们的顶点坐标.

请问如何作到"直接从坐标转换也是可以做到的"呢,还请帮忙写写吧,对我实在重要,还有楼上程序加到您的程序后出现换行后X坐标没归0,烦请改改.

也多谢朋友们的关注,还请大家帮忙出出力,有好方案就贴上来

发表于 2008-5-31 09:38:00 | 显示全部楼层
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:draw ( / cz startp f tmptxt tmp rcz n plent oldosmode oldcmdecho)
  (setq oldosmode(getvar "osmode")
    oldcmdecho(getvar "cmdecho")
    )
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (prompt "\n此程序读取各行数据格式为:参数1,参数2,参数3,数学坐标X值,数学坐标Y值,Z值。")
  (setq f(getfiled "选取文件" " " "txt" 2))
  (prompt "\n正在读取文件中的数据...")
  (setq f(open f "r"))
  (while (setq tmptxt(read-line f))
    (cond
      ((setq tmp(read(strcat "(" (vl-string-translate "," " " tmptxt)")"))) (setq cz (cons tmp cz)))
      (t nil)
    )
  )
  (close f)
  (setq cz (reverse cz))
  ;;上面读取文件为表下面开始进行绘制准备和坐标点转换为平面------
  (if startp nil (setq startp '(-4200 0 0)))
  (setq rcz(mapcar 'cddddr cz));;去除前三个参数,只留下坐标点----
  ;;下面分离坐标出来--------------------------------------------
  (setq rcz(mapcar '(lambda(x)
         (if tmptxt (setq tmptxt nil))
         (while (setq tmptxt (cons (list (car x) (cadr x) (caddr x)) tmptxt)
                  x (cdddr x)))
         (reverse tmptxt)
         ) rcz))
  ;;下面先创建3dpl再旋转,再获得旋转后的坐标--------------------
  ;;不生成pl,直接用矩阵的方法等我有空再写一个------------------
  (setq n -1)
  (setq allplst(mapcar '(lambda(x)
              (apply 'command (cons "._3dpoly" x))(command "")
              (setq plent(entlast) n(1+ n))
              (planar plent);平面化----------------
              (getplst plent)
              ) rcz))
  (princ (strcat "\n总共生成" (itoa (1+ n)) "条多段线!"))
   ;这个allplst;;;这个就是所有多段线的新的端点-----------------
  (setvar "osmode" oldosmode)
  (setvar "cmdecho" oldcmdecho)
  (princ)
)
(defun getplst(pl / i plst tmp)
  (setq i -1)
  (while (setq tmp(vlax-curve-getPointAtParam pl (setq i(1+ i))))
    (setq plst(cons tmp plst))
  )
  (reverse plst)
)
(defun planar(pl / no1p v1 v2 norv rotatev cosv ang)
 ; ;;;上面增加一个获得绘制的多段线----------------
 ; ;;;下面开始进行平面放置(旋转)------------------
  (if pl
    (if (vlax-curve-isPlanar pl);判断是否可平面化---
      (progn
    (if (>= (vlax-curve-getEndParam pl) 2)
      (progn;多于两个点,判断面------------------
        (setq no1p(car x))
        (setq v1(mapcar '- (cadr x) no1p)
          v2(mapcar '- (caddr x) no1p)
          norv(>*> v1 v2);计算面的法向量----
          )
        (if (not (equal (setq rotatev(>*> norv '(0 0 1))) '(0 0 0) 1e-3));判断是否已经在xy面上--
          (progn;不在xy平面上,需要旋转------
        ;首先获得旋转角度和旋转轴-------
        (setq cosv(/ (>&> norv '(0 0 1)) (distance norv '(0 0 0))))
        (setq ang(acos cosv))
        ;;这里可以生成旋转矩阵或者利用rotate3d-----------------------
        (command "._rotate3d" pl "" no1p (mapcar '+ no1p rotatev) (* 180 (/ ang pi)))
        )
          )
        )
      (progn;两个点判断线-------------------
        (setq no1p(car x))
        (setq v1(mapcar '- (cadr x) no1p))
        (if (not (equal (>&> v1 '(0 0 1)) 0 1e-3))
          (progn;;线不在xy平面上------------
        (if (equal (setq rotatev(>*> v1 '(0 0 1))) '(0 0 0) 1e-3)
          (progn;和z轴平行绕x轴或者y轴都可以,先假定绕x轴旋转---------
            (command "._rotate3d" pl "" no1p (mapcar '+ no1p '(1 0 0)) 90)
            )
          (progn;不和z轴平行,计算旋转轴和旋转角度--------------------
            (setq cosv(/ (>&> v1 '(0 0 1)) (distance v1 '(0 0 0))))
            (setq ang(acos cosv))
            (command "._rotate3d" pl "" no1p (mapcar '+ no1p rotatev) (* 180 (/ ang pi)))
            )
          )
        )
          )
        )
      )
    )
      )
    )
  (if (and (zerop(rem n 20)) (> n 0))
      (setq startp (list 0 (- (cadr startp) 6800) 0))
      (setq startp (mapcar '+ startp '(4200 0 0)))
  )
 (if pl
    (command "._move" pl "" (car x) startp)
 )
)
(defun >*>(>a >b / a1 a2 a3 b1 b2 b3)
 (cond
   ((= 2 (length >a));; x1*y2 - x2*y1
    (setq a1(car >a)
      a2(cadr >a)
      b1(car >b)
      b2(cadr >b))
     (- (* a1 b2) (* a2 b1))
   )
   (t
     (setq a1(car >a)
      a2(cadr >a)
      a3(caddr >a)
       b1(car >b)
       b2(cadr >b)
       b3(caddr >b))
    (list (- (* a2 b3)(* a3 b2))
      (- (* a3 b1) (* a1 b3))
      (- (* a1 b2) (* a2 b1)))
    )
 )
)
(defun >&>(>a >b)
 (apply '+ (mapcar '* >a >b))
)
(defun acos(cosv)
 (cond
  ((equal 1 cosv 1e-5) 0)
  ((equal -1 cosv 1e-5) pi)
  (t (- (/ pi 2) (atan (/ cosv (expt (- 1 (* cosv cosv)) 0.5)))))
  )
)
;;你要的旋转后的所有多段线的坐标在变量allplst里面,直接利用矩阵的方法等我什么时候空闲再说
 楼主| 发表于 2008-5-31 12:02:00 | 显示全部楼层

xxsheng你好厉害,原来我需要12k多的程序被你简化一下就不到5k了,而且功能是一样的!!!

烦请xxsheng及各位朋友帮忙写出"直接利用矩阵的方法",也就是先将顶点坐标平面化>>移动>>最后用LINE将顶点坐标连接.(因后续程序要用)

另:请各位在数据分离时顺便将前面三个参数分别赋值给DW,R,N(也因后续开发中要用)

不好意思了,在下又提了过分要求,以上所求不仅可以解决在下难题,也可以为各位看官提供新的解题思路和方法,何乐而不为呢,拜托各位!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 08:44 , Processed in 0.175964 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表