找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 781|回复: 9

[问题一]:用Solid模拟圆弧、圆、Spline、椭圆。

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-7-13 23:56:33 | 显示全部楼层 |阅读模式

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

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

×
用Solid模拟,要求用Lisp及VL函数,不用XDAPI,同时要保持多义线的宽度。

补充:模拟精度可以指定,也可以由程序计算适宜的精度。

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

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-15 00:02:03 | 显示全部楼层
贴几个预备函数

  1. ;;;(setq *acad-object* nil)      ; Initialize global variable
  2. (defun acad-object ()
  3.   (cond (*acad-object*)                 ; Return the cached object
  4.         (t
  5.          (setq *acad-object* (vlax-get-acad-object))
  6.         )
  7.   )
  8. )

  9. ;;;(setq *active-document* nil)  ; Initialize global variable
  10. (defun active-document ()
  11.   (cond (*active-document*)             ; Return the cached object
  12.         (t
  13.          (setq *active-document* (vla-get-activedocument (acad-object)))
  14.         )
  15.   )
  16. )

  17. ;;;(setq *model-space* nil)      ; Initialize global variable
  18. (defun model-space ()
  19.   (cond (*model-space*)                 ; Return the cached object
  20.         (t
  21.          (setq *model-space* (vla-get-modelspace (active-document)))
  22.         )
  23.   )
  24. )
  25. (defun lisp-value (v)
  26.   (cond
  27.     ((= (type v) 'variant)
  28.      (lisp-value (variant-value v))
  29.     )
  30.     ((= (type v) 'safearray)
  31.      (mapcar 'lisp-value (safearray-value v))
  32.     )
  33.     (t v)
  34.   )
  35. )
  36. (defun list->VariantArray (lst varType)
  37.   (vlax-make-variant
  38.     (vlax-safearray-fill
  39.       (vlax-make-safearray varType (cons 0 (1- (length lst))))
  40.       (mapcar
  41.         '(lambda (x)
  42.            (cond ((= (type x) 'list)
  43.                   (vlax-safearray-fill
  44.                     (vlax-make-safearray
  45.                       (if (apply '= (mapcar 'type x))
  46.                         (cond ((= (type (car x)) 'REAL) vlax-vbDouble)
  47.                               ((= (type (car x)) 'INT) vlax-vbInteger)
  48.                               ((= (type (car x)) 'STR) vlax-vbString)
  49.                         )
  50.                         vlax-vbVariant
  51.                       )
  52.                       (cons 0 (1- (length x)))
  53.                     )
  54.                     x
  55.                   )
  56.                  )
  57.                  ((= (type x) 'ename)
  58.                   (vlax-ename->vla-object x)
  59.                  )
  60.                  (t x)
  61.            )
  62.          )
  63.         lst
  64.       )
  65.     )
  66.   )
  67. )
  68. (defun selectionsetToArray (ss / c r)
  69.   (setq c -1)
  70.   (repeat (sslength ss)
  71.     (setq r (cons (ssname ss (setq c (1+ c))) r))
  72.   )
  73.   (setq r (reverse r))
  74.   (vlax-safearray-fill
  75.     (vlax-make-safearray vlax-vbObject (cons 0 (1- (length r))))
  76.     (mapcar 'vlax-ename->vla-object r)
  77.   )
  78. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-15 00:08:53 | 显示全部楼层
增加Trace,Active用法

  1. (vla-addtrace
  2.   modelspace
  3.   (list->VariantArray
  4.     ptlst
  5.     vlax-vbdouble
  6.   )
  7. )
复制代码

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-15 00:17:43 | 显示全部楼层
说明下程序的目的,一个DWG文件其直接利用的价值降到最低(几乎为0)也就实现了加密的目的,同时CAD可以打开也不会伤和气,对图谋不轨道甲方也只能哑巴吃黄莲。图形“加密”的方法经过思考简单的最佳组合:DWFOUT->DWFIN->再处理ARC、CIRCLE,注意其中不可用TTF字体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-15 18:45:07 | 显示全部楼层
再贴一段。

  1. ;;发图前处理下图形 Beta 0.01
  2. ;;配合 dwfout -> dwfin 使用
  3. ;;如果可能再将图形不等比缩放一点点(不包括图框)
  4. ;;需要改进的:
  5. ;;    1 增加处理 arc circle spline 及保持宽度的Pline部分功能
  6. ;;    2 对Line分解为一点点间隙的特定长度的Trace
  7. ;;
  8. ;;                          Writen By eachy 2003.07.15
  9. ;;                             Email: [email]eachy@21cn.com[/email]
  10. ;; 图形比较大时要耐心等等呦
  11. (defun c:killdwg (/        $same_layer          activedoc            modelspace
  12.                lay        ln         tn          ss           sp            ep
  13.                n        ptlst layers blocks
  14.               )
  15.   (setvar "cmdecho" 0)
  16.   (if (null (tblsearch "layer" "Defpoints"))
  17.     (vl-cmdf "_.layer" "m" "Defpoints" "")
  18.   )
  19.   (if (/= (getvar "clayer") "Defpoints")
  20.     (setvar "clayer" "Defpoints")
  21.   )
  22.   ;;统一图层并保持颜色
  23.   (defun $same_layer (vla-object laylst / la)
  24.     (setq la (vla-get-layer vla-object))
  25.     (vla-put-layer vla-object "Defpoints")
  26.     (if        (= 256 (vla-get-color vla-object))
  27.       (vla-put-color vla-object (cadr (assoc la laylst)))
  28.     )
  29.   )
  30.   (setq        activedoc  (vla-get-activedocument (vlax-get-acad-object))
  31.         modelspace (vla-get-modelspace activedoc)
  32.         layers (vla-get-layers activedoc)
  33.         blocks (vla-get-blocks activedoc)
  34.   )
  35.   ;;获取图层列表(("layer1" color1) ("layer2" color2) ... )
  36.   (vlax-for item layers
  37.     (setq
  38.       lay (cons (list (vla-get-name item) (vla-get-color item)) lay)
  39.     )
  40.   )
  41.   (princ "\n正在处理实体....")
  42.   ;;统一图层并保持颜色
  43.   (vlax-for for-item modelspace
  44.     ($same_layer for-item lay)
  45.   )
  46.   ;;用DWFOUT-》DWFIN的图去掉处理图块
  47.   ;;处理块定义
  48.   (princ "\n正在处理图块定义...")
  49.   (vlax-for for-item blocks
  50.     (vlax-for obj for-item
  51.       ($same_layer obj lay)
  52.     )
  53.   )
  54.   ;;处理图块结束
  55.   ;|循环分解图中所有块
  56.   (while (setq ss (ssget "x" '((0 . "region,insert,dimension,hatch"))))
  57.     (vl-cmdf "_.explode" ss)
  58.   )|;
  59.   ;;变换图中Line实体
  60.   (setq n 0)
  61.   (setq ss (ssget "x" '((0 . "line"))))
  62.   (if ss
  63.     (progn
  64.       (princ "\n正在处理Line实体...")
  65.       (repeat (sslength ss)
  66.         (setq ln (vlax-ename->vla-object (ssname ss n)))
  67.         (setq sp (vlax-curve-getstartpoint ln)
  68.               ep (vlax-curve-getendpoint ln)
  69.         )
  70.         (setq ptlst (apply 'append
  71.                            (list (polar sp (angle sp ep) 1e-10)
  72.                                         ;此值可自行调整以防止用程序反处理经过本程序处理的图形
  73.                                  (polar sp (/ pi 3) 1e-10)
  74.                                  (polar ep (/ pi 3) 1e-10)
  75.                                  (polar ep (angle ep sp) 1e-10)
  76.                            )
  77.                     )
  78.         )
  79.         ;;增加trace
  80.         (setq tn (vla-addtrace
  81.                    modelspace
  82.                    (vlax-safearray-fill
  83.                      (vlax-make-safearray vlax-vbDouble '(0 . 11))
  84.                      ptlst
  85.                    )
  86.                  )
  87.         )
  88.         (vla-put-color tn (vla-get-color ln))
  89.         (vla-erase ln)
  90.         (setq n (1+ n))
  91.       )
  92.     )
  93.   )
  94.   (vl-cmdf "_.purge" "all" "*" "n")
  95.   (princ "\n\t===处理完成,OK!====")
  96.   (princ)
  97. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-16 08:21:22 | 显示全部楼层

  1. ;|Curve 类 AcDbLine、AcDbPolyline(lwpolyline),AcDbArc,AcDbCircle,AcDbEllipse,
  2.            AcDbSpline AcDb2dPolyline
  3. |;
  4. (defun $ea_iscurve (objectname)
  5.   (member objectname
  6.           '("AcDbArc"               "AcDbPolyLine"          "AcDbLine"
  7.             "AcDbEllipse"      "AcDbSpline"          "AcDbCircle"
  8.             "AcDb2dPolyline"
  9.            )
  10.   )
  11. )
  12. ;;获取Curve类曲线的面积,周长
  13. (defun ea:getarea (e / obj)
  14.   (setq obj (vlax-ename->vla-object e))
  15.   (if ($ea_iscurve (vla-get-objectname obj))
  16.     (list (vlax-curve-getarea obj)
  17.           (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj))
  18.     )
  19.     nil
  20.   )
  21. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-18 14:14:08 | 显示全部楼层
没有人响应呀?继续贴一部分。
killdwg -简单处理图形程序,用Trace模拟Line、Arc、Circle、Spline、没有宽度的Pline。
模拟精度控制断线的长度,可以采用默认值。处理后的实体位于Defpoints图层但保持原图层颜色。

尚不能处理的几个问题:文字、线型、不等宽多义线。

说明:
处理之前你还可以执行下面几句,当然对含属性的块可以用CAD扩展工具中的xexplode.

  1. (defun c:expall        (/ ss)
  2.   (setvar "qaflags" 1)
  3.   (while (setq ss (ssget "x"
  4.                          '((0 . "hatch,insert,dimension,region")
  5.                            (100 . "acdb3dpolyline")
  6.                            (100 . "acdb2dpolyline")
  7.                           )
  8.                   )
  9.          )
  10.     (vl-cmdf ".explode" ss "")
  11.     (setq ss nil)
  12.   )
  13.   (vl-cmdf ".purge" "all" "*" "n")
  14.   (princ)
  15. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-7-19 08:49:56 | 显示全部楼层
你肯定要保证可以打印吧.

那我打出来扫描,再矢量化.

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-7-19 09:19:35 | 显示全部楼层
最初由 aeo 发布
[B]你肯定要保证可以打印吧.

那我打出来扫描,再矢量化.

其实dwfout----dwfin已经可以了.ttf再分解一下.鬼才乐意再改来改去的了. [/B]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 01:03 , Processed in 0.448513 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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