找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1086|回复: 0

[文章]:使用对实体访问的功能快速标注尺寸

[复制链接]

已领礼包: 8779个

财富等级: 富甲天下

发表于 2003-12-18 16:57:43 | 显示全部楼层 |阅读模式

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

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

×
使用对实体访问的功能快速标注尺寸  




前言

  AutoCAD二维图形的标注尺寸是通过命令或菜单进行的,尺寸标注的基本类型分长度型、角度型、直径型与半径型。一个完整的尺寸由尺寸线、尺寸界线、尺寸文本和箭头四部分组成。进入尺寸标注状态,出现提示符Dim:后再键入各种子命令;要选择第一和第二尺寸界线始点,选尺寸线位置,给尺寸数值等操作步骤。
  现在可以编制一个标注尺寸的LISP程序,使用对实体访问的功能,在程序中定义不同类型的标注尺寸分类函数和标注尺寸调用函数,通过command函数将AutoLISP给它的Dim命令及其参数传递到AutoCAD去执行。在执行过程中只需要选择实体而不需要通过命令或菜单去完成。选择第一和第二尺寸界线始点、选尺寸线位置、给尺寸数值等操作由程序自动进行。可以实现交互性快速地标注尺寸。

1 访问机制

  用AutoCAD画好了的零件草图,AutoCAD的图形数据库(简称图库)中存贮着当前有关图形的全部信息。例如:各种绘图状态与方式,符号表、所有块及其属性描述、实体数据等。
  AutoLISP它也有自己的内部数据库(简称LISP数据库),记录着系统本身和用户的一切函数和变量。
  AutoLISP数据库与AutoCAD图库之间存在着如下通讯方法:
  利用command函数将AutoLISP给它的命令及其变量传递到AutoCAD去执行,实现从AutoLISP数据库向AutoCAD图库的传递。
  利用getvar/setvar函数,使AutoLISP程序获得或修改系统变量的值,对AutoCAD的绘图状态与方式进行存取。
  利用entsel、entget实体存取函数,AutoLISP程序可以访问或修改AutoCAD图库中的任何实体数据。
  AutoCAD实体是指用一条命令便可绘制成的系统预定的图形单元。实体可分为简单和复杂两种类型。
  每个简单实体(如Line、Circle、Arc等)在图形数据库中都有唯一的实体名,用以标识该实体。
  每个复杂实体(如Pline、polygon、块等)在图形数据中包含一个主实体、若干子实体。主实体的子实体都有各自的实体名加以标识。
  实体数据表在LISP数据库中均采用关联表形式,其中每个点对是由一个DXF组码及其组值构成的。实体名的组码规定为-1,实体类型的组码为0。用AutoLISP程序访问实体的基本方法是:首先获得实体名及其数据表,接着对该表进行处理,最后利用command函数将AutoLISP给它的DIM命令实现尺寸标注。并同时更新AutoCAD图形数据库。

2 程序设计

  entsel〈提示〉函数将经过选取一点来选择一个实体,将返回一个表,表中第一个元素是所选择的实体名,第二个元素是用于选择实体的点的坐标。例如:
  Command:Line
  From point:1,1
  To point:6,6
  To point:Return
  Command:(setq e (entsel\"please choose an entity:”))
  Please choose an entity:3,3
  (〈Entity name:60000014〉(3.0.3.0.0.0))
  entget〈实体名〉函数可从图库中取出名为〈实体名〉的实体,同时返回一个表。该表将包含定义该实体的数据。表的结构以LISP的关联表形式编制,用assoc表处理函数可以容易地从中获得每一项,它们是为实体数据的每个部分准备的。例如。
  Command:(setq a(entget(car e)))
  ((-1.〈Entity name:60000014〉)
  (0.“LINE”)      实体类型
  (8.“0”)           层
  (10 1.0.1.0.0.0        起始点
  (11 6.6.0.6.0.0.0)       终止点
  )
  在LISP程序结构中使用(cdr(assoc 0 a))表可获得各种实体类型。
  在标注线型尺寸的程序结构中,使用(cdr(assoc 10 a))表和(cdr(assoc 11 a))表可获得直线的起始点与终止点坐标,使用distance函数可返回两点之间的距离。
  在标注直径(半径)尺寸的程序结构中,使用(cdr(assoc 10 a))表可获得圆心坐标,使用(cdr(assoc 40 a))表或获得圆(圆弧)的半径。
  在标注两直线间距尺寸的程序结构中,使用(setvar“LASTPOINT”(cadr el))表给系统变量赋值,返回第一条直线上实体选择点是最后点。使用(osnap(cadr e2)“PER”)表返回由最后点向第二条直线上捕捉垂足。
  在标注直线与圆弧切点(如键槽)尺寸的程序结构中,使用(osnap(cadr el)“MID”)表和(osanp(cadr e2)“MID”)表可以捕捉直线和圆弧上的中点。
  不同类型的标注尺寸分类函数和标注尺寸调用函数为
  LD   函数  线型尺寸标注。
  CD   函数  直径尺寸标注。
  RD   函数  半径尺寸标注。
  LLD   函数  平行两直线间距尺寸标注与角度尺寸标注。
  CCD   函数  孔中心距尺寸标注。
  LAD   函数  键槽尺寸标注。
  DIME  函数  标注尺寸调用函数。
  标注尺寸文件名ed.lsp
  由于编制的LISP程序较大,现将其部分程序列举如下:
  ;DIMENSION
  ;Drawing linear
  
  (defun LD(a u)
    (setq dis(distance(cdr(assos 11 a))(cdr(assoc 10 a))))
    (setq dl(getdist(cdr(assos 11 a))“\nEnter distance:”))
    (setq ang(getangle(cdr(assoc 11 a))“\nEnter angle:”))
     (command“DIM”
  “ALI”(cdr(assoc 10 a))(cdr(assoc 11 a))
  (polar(cdr(assoc 11 a))ang dl)
  (rtos dis 2 u)
  “EXIT”)
  )
  ;Drawing diameter
  
  (defun CD(a u)
    (setq cen(cdr(assoc 10 a)))
    (setq r(cdr(assoc 40 a)))
    (setq d(?2 r))
    (setq ang(getangle(cdr(assoc 10 a))“\nEnter angle:”))
     (command“DIM”
  “DIA”(polar cen ang r )(strcat“%%C”(rtos d z u))“”
  “EXIT”)
  )
  ;Drawing distance between both linear and angular
  
  (defun LLD(el e2 a b ptl pt2 u)
  (setq af1 (angle(cdr(assoc 10 a))(cdr(assoc 11 a))))
  (setq af2 (angle(cdr(assoc 10 b))(cdr(assoc 11 b))))
  (if (> af1 af2)(setq af0 af1 af1 af2 af2 af0))
  (setq af( -af2 af1))
  (print(?180.0(/ af1 pi)))
  (print(?180.0(/ af2 pi)))
  (print(?180.0(/ af pi)))
  (if(or(= af 0)(= af pi))
    (progn
  (setq pt1(setvar“LASTPOINT”(cadr el)))
  (setq pt1(osnap(cadr e2)“PER”))
  (setq dis(distance pt1 pt2))
  (setq dl(getdist pt2“\nDistance:”))
   (setq ang(getangle pt2“\nAngle:”))
      (command“DIM”
  “ALI”pt1 pt2(polar pt1 ang dl)(rtos dis z u)
  “EXIT”
      )
      (if(and(/= af 0)(/= af pi))
      (progn
  )
  )
  ;Drawing aligned between linear and arc tengent
  
  (defun LAD(e1 e2 a b pt1 pt2 u)
    (setq pt1(osnap(cadr e1)“MID”))
    (setq pt2(osnap(cadr e2)“MID”))
    (setq dis(distance pt1 pt2))
    (setq d1(getdist pt2“\nEnter Distance:”))
    (setq ang(getangle pt2“\nEnter Angle:”))
     (command“DIM”
  “ALI”pt2 pt1(polar pt2 ang dl)(rtos dis 2 u)
  “EXIT”)
  )
  ;Dimension main function
  
  (defun C:DIME(/e1 e2 na nb a b pt1 pt2 dx dy dis ang d1
  r d exe af1 af2 af u)
  (setq u 0)
  (setvar“CMDECHO”0)(setvar“BLIPMODE”0)
  (command “DIMCLRD”2“DIMCLRE”2“DIMCLRT”4)
  (setq e1(entse1“\nPlease choose an entity:”))
  (setq e2(entse1“\nPlease choose an entity:”))
  (setq na(car el))(setq a(entget na))
  (setq pt1(osnap(cadr el)“NEA”))
    (cond((and(not e2)(=“LINE”(cdr(assoc 0 a))))
       (LD a u))
  ((and(not e2)(=“CIRCLE”(cdr(assoc 0 a))))
   (AD a u))
  ((and(not e2)(=“ARC”(cdr(assoc 0 a))))
   (AD a u))
       )
  (iF(/= e2 nil)
  (progn
  (setq nb(car e2))(setq b(entget nb))
  (setq pt2(osnap(cadr e2)“NEA”))
    (cond((and(listp b)(=“LINE”(cdr(assoc 0 b)))
  (=“LINE”(cdr(assoc 0 a)))
  (LLD e1 e2 a b pt1 pt2 u))
  ((and listp b)(=“CIRCLE”(cdr(assoc 0 a)))
  (=“CIRCLE”(cdr(assoc 0 b)))
       (CCD e1 e2 a b pt1 pt2 u))
       ((and listp b)(or(and(=“LINE”(cdr(assoc 0 a)))
  (=“ARC”(cdr(assoc 0 b))))
  (and(=“ARC”(cdr(assoc 0 a)))
  (=“LINE”(cdr(assoc 0 b))))
         ))
       (LAD e1 e2 a b pt1 pt2 u))
    )
   ))
  )
  

3 使用向导

  把ed.lsp文件存入磁盘,然后在AutoCAD中启动一张需要标注尺寸的零件草图,该草图是用简单实体绘制的。当AutoCAD的Command:提示出现时,输入下面命令来装载DIME函数。如果操作成功,Load将返回文件中定义的最后那个函数的名称,否则返回一错误信息。
  Command:(load“ed”)  回车。
   C:DIME返回函数名。
  Command:DIME执行该函数。
  Please choose an entity:单击鼠标左键在图中选择一个实体。
  Please choose an entity:单击鼠标左键在图中再选择一个实体或者按鼠标右键结束选择实体。
  Enter distance:选尺寸线位置的极坐标长度。
  Enter angle:选尺寸线位置的极坐标角度。
  在标注尺寸之前必须设置好有关的尺寸变量。控制尺寸线,箭头、尺寸界线、尺寸文本颜色的尺寸变量在程序中用颜色代码已经设置。如果图线是用复杂实体(如Pline)绘制的,在标注尺寸之前必需将Pline线用Explode命令炸开以后再进行标注。有些线型尺寸选择一个实体与选择两个实体标注效果一样。

4 结束语

  由于在该LISP程序结构中使用了(cdr(assoc 0 a))表可自动识别实体类型,系统为用户提供的不同基本类型的尺寸标注,则不需要通过命令或菜单去完成。标注尺寸的操作过程由程序自动进行,因此用这种方法标注尺寸能加快速度,也可编制一些常用图形的尺寸标注。用“C:DIME”自定义函数可增加AutoCAD的新命令。它与AutoCAD的内部命令在形式上毫无差别,用户可以将它编写在ACAD.LSP中,一旦进入AutoCAD图形编辑状态,这条新命令就自动地装入,从而建成用户自己的扩充命令(函数)库。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-26 22:36 , Processed in 0.251389 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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