找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6053|回复: 21

[有奖答题] 图中的文字方向是反的,怎么能给他们正过来?

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-24 17:24:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×



继续有奖答题,下面是个建筑的日照分析图,图中的文字的法线方向是反的,需要把他们正过来。

图中的“立方体”是一个平面矩形elevation拉伸起来的代表楼房,那些文字数据时日照分析的时间数据,视图是西南等轴测图。这个和专业无关,就是简单的怎么样把在一个三维面上的文字给“正”过来。

1、全景图

test4.png


2、局部放大,错误的显示

test5.png


3、正确的结果应该是:

test6.png



还是同样啊,大家WCS测试没问题后,别忘记随便建个UCS,在UCS下也测试下。

下面附件是测试DWG图形。

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:test4.rar 
下载次数:22  文件大小:38.71 KB 
下载权限: 不限 以上  [免费赚D豆]

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-4-24 17:35:49 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-4-24 17:37 编辑

你用的什么版本做的?是不是太老的版本了, 3drotate
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-24 17:46:29 | 显示全部楼层
不是rotate3d么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-24 18:00:47 | 显示全部楼层

在讨论程序设计技巧嘛。最近这几个题,最终都是往着一个方向去的,试试用LISP或者VLISP给写出来。试试ENTGET这些文字的数据,看看里面的点的表述。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-24 19:19:29 | 显示全部楼层
文本三维旋转02.gif

  1. (defun c:tt (/ i ss s1 pt)
  2.   (setq i -1)
  3.   (if (setq ss (ssget '((0 . "TEXT") (8 . "ZZ_RZ_SML_NETWORK"))))
  4.     (while (setq s1 (ssname ss (setq i (1+ i))))
  5.       (setq d210 (xyp-DXF 210 s1))
  6.       (if (and (> (setq a (car d210)) 0) (> (setq b (cadr d210)) 0))
  7.         (progn
  8.           (setq        pt (xyp-9pt s1 5)
  9.                 p1 (list (car pt) (cadr pt) (+ (caddr pt) 100))
  10.           )
  11.           (xyp-3D-Rotate s1 pt p1 180)
  12.         )
  13.       )
  14.     )
  15.   )
  16.   (princ)
  17. )
大概思路:选取特定图层文本,判断dxf 210码值,使文本于中心点处绕Z轴旋转180°

评分

参与人数 1D豆 +5 收起 理由
XDSoft + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-24 19:26:26 | 显示全部楼层
xyp1964 发表于 2013-4-24 19:19
大概思路:选取特定图层文本,判断dxf 210码值,使文本于中心点处绕Z轴旋转180°

差函数,XYP,另外试试别用3DROTATE做做。

点评

目前还不会矩阵转换  发表于 2013-4-24 19:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-4-25 17:30:11 | 显示全部楼层
本帖最后由 ll_j 于 2013-4-26 09:23 编辑

试试我的:
[pcode=lisp,true]
(defun c:tt (/ ss len i en e00 e10 e11 e50 e210 e211 e72)
  (princ "\n选择要翻转的文本.")
  (setq ss (ssget '((0 . "text")))
        len (sslength ss)
        i -1
  )
  (repeat len
    (setq en (entget (ssname ss (setq i (1+ i))))
          e210 (cdr (assoc 210 en))
          e211 (mapcar  '-  e210)
          e50 (cdr (assoc 50 en))
          en (subst  (cons 50 (- e50)) (assoc 50 en) en)
          en (subst  (cons 210 (mapcar  '-  e210)) (assoc 210 en)  en)
    )
    (cond
      ((or
         (= (setq e72 (cdr (assoc 72 en))) 1 )
         (= e72 4)
       )
        (setq e11 (cdr (assoc 11 en))
              e10 (cdr (assoc 10 en))
              en (subst  (cons 10 (trans (trans e11 e210 0) 0 e211)) (assoc 10 en) en)
              en (subst  (cons 11 (trans (trans e11 e210 0) 0 e211)) (assoc 11 en) en)
        )
      )
      ((or
         (= e72 2)
         (= e72 3)
         (= e72 5)
       )
        (setq e10 (cdr (assoc 10 en))
              e11 (cdr (assoc 11 en))
              en (subst  (cons 10 (trans (trans e11 e210 0) 0 e211)) (assoc 10 en) en)
              en (subst  (cons 11 (trans (trans e10 e210 0) 0 e211)) (assoc 11 en) en)
        )
      )
      ((= e72 0)
        (if (= (cdr (assoc 73 en)) 0)
          (setq e10 (cdr (assoc 10 en))
                e00 (list (* (caadr (textbox en)) (cos e50))
                             (* (caadr (textbox en)) (sin e50))
                             0.0
                    )
                e10 (mapcar  '+ e00 e10)
                e10 (trans (trans e10 e210 0) 0 e211)
                en (subst (cons 10 e10) (assoc 10 en) en)
          )
          (setq e10 (cdr (assoc 10 en))
                e11 (cdr (assoc 11 en))
                e00 (list (* (caadr (textbox en)) (cos e50))
                             (* (caadr (textbox en)) (sin e50))
                             0.0
                    )
                e11 (mapcar '+ e00 e11)
                e11 (trans (trans e11 e210 0) 0 e211)
                e10 (trans (trans e10 e210 0) 0 e211)
                en (subst (cons 10 e10) (assoc 10 en) en)
                en (subst (cons 11 e11) (assoc 11 en) en)
          )
        )
      )
      (t
        nil
      )
    )
    (entmod en)
  )
  (princ)
)
[/pcode]

点评

测试,可行。  发表于 2013-4-25 17:42

评分

参与人数 1D豆 +5 收起 理由
XDSoft + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 17:43:10 | 显示全部楼层
ll_j 发表于 2013-4-25 17:30
试试我的:

(defun c:tt (/ ss len i en e00 e10 e11 e50 e210 e211 e72)

可以分享下这个程序设计时候的一些心得吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-25 18:20:17 | 显示全部楼层
跟大家学习下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-4-25 22:10:22 | 显示全部楼层
XDSoft 发表于 2013-4-25 17:43
可以分享下这个程序设计时候的一些心得吗?

       折腾了大半天,是有些话要说的,临下班才折腾好,匆忙发帖,所以最后有些代码也没有优化。

       开始只是就事论事,也想到210组码的问题,但没有深究,也出了结果(可以应付你的题目),但是推而广之到普遍问题,就不行了,于是仔细查找,发现看似复杂的情况其实也很简单,归结起来就是,实体坐标到世界坐标,再回到实体坐标,于是就有了坐标转换。

       文字是二维的实体(应该可以推及轻多义线、块等),坐标组码都是建立在实体平面的(其实是与实体平行的平面),这个平面与世界坐标系的关系通过210组码来表示,所以在进行坐标转换trans时,210组码和实体本身作用是相同,现在,要把文字反向,即是将实体平面翻转,210组码均反向,而相对于原本实体平面的坐标(组码)要建立与翻转平面的对应关系,就要找一个过渡物,本程序就是使用世界坐标系过渡(其实与当前坐标系或世界坐标系无关)。

       推及普遍,就不能不考虑文字的对齐方式,不管文字的对齐方式如何,均应关于中心翻转,同时还应保持对齐方式不变,于是有了变化,对左对齐的文字通过textbox计算其翻转后的对齐点,右对齐的交换左右点,中心对齐的直接旋转。

       需要说的是中心对齐的点,原本看似最简单的,却耗去了大半天,程序没错,结果总是错的,最终发现原因:在组码72不为0时,坐标应由组码11控制,现在文档中都这样介绍,但结果是,这是针对二维来说的,对于三维文字而言,仅仅转换组码11是不行的,实际上,组码的z坐标仍旧由组码10控制。
       程序在自己设定的多种角度、多种对齐方式下测试过,可以使用,虽然感觉原理是正确的,但仍旧不能保证在所有情况下均通过,权当一次对坐标系的理解吧。

       大体就是这样,这几天如果得空,我还想试试一个以假乱真的翻转,或许视觉上也能过得去。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 22:37:25 | 显示全部楼层
感谢洋洋洒洒的大段美文,可见用功之深,在三维下,实体数据保存方式确实很有学问,如你说的210祖玛。同时也对LL_J对纯LISP的坚持表示钦佩。这是最深的功夫。正因为ACAD实体类型繁多,数据定义也繁多,造成了程序设计用LISP对很多编辑类功能处理时候要求很高。

我出这个题目,一是让大家探究下entget里面的数据,另外一个也是希望大家能用一种解决问题的最通用的方式思考,那就是图形变换的即时,矩阵转换。

http://bbs.xdcad.net/forum.php?m ... =667613&pid=3445677

这个帖子,也希望LL_J有时间发表下见解。很希望早点见到你那以假乱真的“翻转”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-25 22:37:47 | 显示全部楼层
在 ActiveX 中除了左对齐,其他方式也是先设置 InsertionPoint,然后指定Alignment,最后再指定TextAlignmentPoint,这个对起点和InsertionPoint一样(除了Fit模式),AutoCAD会自动调整
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-25 23:05:27 | 显示全部楼层
[pcode=lisp,true](defun c:tt (/ GETBOX A B ORIGN SS N OBJ CP)
  (defun getbox  (obj / minpoint maxpoint)
     (vla-GetBoundingBox obj 'minpoint 'maxpoint)            
     (setq minpoint (vlax-safearray->list minpoint))          
     (setq maxpoint (vlax-safearray->list maxpoint))            
     (list minpoint maxpoint)
     )
  (setq        a     pi
        b     0
        orign (vlax-3d-point '(0 0 0))
  )
  (if (setq ss (ssget ":L"))
    (repeat (setq n (sslength ss))
      (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n))))
            box (getbox obj)
            cp (mapcar '* (apply 'mapcar (cons '+ box)) '(0.5 0.5 0.5)))
      (vla-move obj  (vlax-3d-point cp) orign)
      (vla-TransformBy obj (vlax-tmatrix
                              (list
                                (list (cos a) (- (sin a)) 0 (car cp))
                                (list (* (sin a) (cos b)) (* (cos a) (cos b)) (- (sin b)) (cadr cp))
                                (list (* (sin a) (sin b)) (* (cos a) (sin b)) (cos b) (caddr cp))
                                (list 0 0 0 1)
                                )
                              )
        )
      )
    )
  (princ)
  )[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-26 01:04:02 | 显示全部楼层
处处问题鸟 发表于 2013-4-25 23:05
(defun c:tt (/ GETBOX A B ORIGN SS N OBJ CP)
  (defun getbox  (obj / minpoint maxpoint)
     (vla ...

第一个用矩阵变换的程序。把程序整理下,把变换矩阵单独做个函数吧,好让大家看清以什么样的变换矩阵。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-26 09:51:44 | 显示全部楼层
XDSoft 发表于 2013-4-26 01:04
第一个用矩阵变换的程序。把程序整理下,把变换矩阵单独做个函数吧,好让大家看清以什么样的变换矩阵。

这个矩阵变换在高飞鸟的这个帖子里有详细论述:
http://www.xdcad.net/forum/forum ... &extra=page%3D1
帖子中第九条就是变换矩阵函数:
[pcode=lisp,true];;;-----------------------------------------------------------;;
;;;通用的轴测变换矩阵     highflybird  2012.12                ;;
;;;Axonometric projections Rotation matrices                  ;;
;;;Isometric projection: a = (/ pi 4),b = (atan (- (sqrt 2))) ;;
;;;Input: a - Rotation angle about the vertical axis          ;;
;;;       b - Rotation angle about the horizontal axis        ;;
;;;Output: transforamtion matrix of this projection           ;;
;;;-----------------------------------------------------------;;
(defun MAT:ISO (a b / ca sa cb sb)
  (setq ca (cos a))
  (setq sa (sin a))
  (setq cb (cos b))
  (setq sb (sin b))
  (list (list ca        (- sa)    0      0)
        (list (* sa cb) (* ca cb) (- sb) 0)
        (list (* sa sb) (* ca sb) cb     0)
        (list 0 0 0 1)
  )
)[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-19 16:06 , Processed in 0.551987 second(s), 65 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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