找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 678|回复: 3

[教学]:API应用-Dinsert。

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2002-3-28 15:02:14 | 显示全部楼层 |阅读模式

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

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

×
  1. ;|
  2. 命令: dinsert
  3. 功能: 动态插入图块,可以用图块的包围盒模拟。
  4. |;
  5. (defun c:dinsert (/ dwg s s1 p an r #blk ptl tfz key)
  6.   ;;获取图块文件
  7.   (setq        dwg (xdrx_getfiled "" "" "")
  8.         ;pt  '(0 0 0)
  9.   )
  10.   (if dwg
  11.     (progn
  12.       (xdrx_begin)
  13.       (xdrx_ucson)
  14.       ;;默认值
  15.       (if (not #key)
  16.         (setq #key "2")
  17.       )
  18.       (initget 128 "1 2")
  19.       (if (not (setq key (getkword (strcat "\n[1 轮廓显示/2 实际显示]<"
  20.                                            #key
  21.                                            ">: "
  22.                                    )
  23.                          )
  24.                )
  25.           )
  26.         (setq key #key)
  27.         (setq #key key)
  28.       )
  29.       ;;将图块引入图中
  30.       (command ".insert" (car dwg) '(0 0 0) 1 "" 0)
  31.       (entdel (entlast))
  32.       ;|(setq e (xdrx_object_get "block" (getvar "insname")));;块实体名
  33.       (if (setq        p (xdrx_dragssmove
  34.                     ;;动态移动
  35.                     "\n请点取插入点: "
  36.                     (if        (= key "1")
  37.                       s1
  38.                       s
  39.                     )
  40.                     pt
  41.                   )
  42.           )
  43.         (command ".move"
  44.                  (if (= key "1")
  45.                    s1
  46.                    s
  47.                  )
  48.                  ""
  49.                  pt
  50.                  p
  51.         )
  52.       )|;
  53.       ;;动态插入,用insert ^_^,为了后面的效果还得删除
  54.       (princ "\n插入点: ")
  55.       (command ".insert" "" pause 1 "" 0)
  56.       (setq s (ssget "L"))
  57.       ;;获得拾取的插入点
  58.       (setq p (car (xdrx_drawing->lastpts)))
  59.       (setq #blk (xdrx_entity_box s))
  60.       ;;判断图块整体是否超出屏幕
  61.       (if (setq        tfz (apply
  62.                       'xdrx_isptoffscr
  63.                       #blk
  64.                     )
  65.           )
  66.         (progn
  67.           (xdrx_drawing_viewsave)
  68.           (if (setq #blk (xdrx_entity_box s))
  69.             (progn
  70.               (setq pt1        (cadr #blk)
  71.                     pt2        (last #blk)
  72.               )
  73.               (xdrx_drawing_zoomw pt1 pt2 t)
  74.             )
  75.           )
  76.         )
  77.       )
  78.       ;;绘制图块轮廓
  79.       (if (= key "1")
  80.         (progn
  81.           (entdel (entlast))
  82.           (command ".rectang" (car #blk) (nth 2 #blk))
  83.           (setq s1 (ssget "l"))
  84.         )
  85.       )
  86.       ;动态缩放、旋转
  87.       (if (setq        r (xdrx_dragsscale       
  88.                     "\n图块比例 <1>: "
  89.                     (if        (= key "1")
  90.                       s1
  91.                       s
  92.                     )
  93.                     p
  94.                                         ;1
  95.                   )
  96.           )
  97.         (progn
  98.           (if (= 'STR (type r))
  99.             (setq r (atof r))
  100.           )
  101.           (if (= r 0)
  102.             (setq r 1)
  103.           )
  104.           (command ".scale"
  105.                    (if (= key "1")
  106.                      s1
  107.                      s
  108.                    )
  109.                    ""
  110.                    p
  111.                    (abs r)
  112.           )
  113.         )
  114.       )
  115.       (if (setq        an (xdrx_dragssrotate
  116.                      "\n如需旋转角度, 请点取要旋转的角度 <不调整>: "
  117.                      (if (= key "1")
  118.                        s1
  119.                        s
  120.                      )
  121.                      p
  122.                    )
  123.           )
  124.         (command ".rotate"
  125.                  (if (= key "1")
  126.                    s1
  127.                    s
  128.                  )
  129.                  ""
  130.                  p
  131.                  an
  132.         )
  133.       )
  134.       (if (= key "1")
  135.         (progn
  136.                                         ;(xdrx_entity_delete s1)
  137.                                         ;(xdrx_entity_delete s)
  138.           (command ".erase" s1 s "")
  139.           (command ".insert"
  140.                    ""
  141.                    p
  142.                    (if (not r)
  143.                      "1"
  144.                      r
  145.                    )
  146.                    ""
  147.                    (if (not an)
  148.                      "0"
  149.                      an
  150.                    )
  151.           )
  152.         )
  153.       )
  154.       (if tfz
  155.         (xdrx_drawing_viewres)                ;恢复视窗
  156.       )
  157.       (xdrx_ucsoff)
  158.       (xdrx_end)
  159.     )                                        ;progn
  160.   )                                        ;if
  161.   (princ)
  162. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2002-3-28 15:06:18 | 显示全部楼层
以下内容为编程之前与XD的对话。

  1. ....
  2. XDSoft 说:
  3. 用API的拖动
  4. eachy 说:
  5. 先要获取dwg路径和文件名
  6. XDSoft 说:
  7. 用xdrx_getfiled
  8. XDSoft 说:
  9. 让它选择文件
  10. XDSoft 说:
  11. 然后移动,缩放,旋转
  12. XDSoft 说:
  13. 考虑到程序快,用xdrx_entity_box得到包围盒
  14. XDSoft 说:
  15. 拖动这个矩形框也可以
  16. XDSoft 说:
  17. 分别写个吧,一个是矩形框,一个是实际
  18. ...
  19. eachy 说:
  20. 想到了天正的“实插图框”、“虚插图框”
  21. ...
  22. eachy 说:
  23. dragssxx一定要选择集,实体不行?
  24. ...
  25. XDSoft 说:
  26. (ssget "l")
  27. ...
  28. eachy 说:
  29. 还得判断当前屏幕框是否比插入的块框小
  30. XDSoft 说:
  31. xdrx_drawing_screenbox
  32. ...
  33. XDSoft 说:
  34. xdrx_isptoffscr
  35. XDSoft 说:
  36. 或者判断屏幕的框在块的框内部
  37. ...
  38. XDSoft 说:
  39. 直接用xdrx_drawing_zoomw
  40. XDSoft 说:
  41. 用10倍的块高度ZOOM窗口
  42. XDSoft 说:
  43. 几倍自己实验下
  44. XDSoft 说:
  45. 把块基点做屏幕中心
  46. XDSoft 说:
  47. ZOOM之前用xdrx_drawing_viewsave
  48. eachy 说:
  49. 我是这样,先将块用1:1插到(0 0 0)点,然后用拖动
  50. XDSoft 说:
  51. 之后,用xdrx_drawing_viewres恢复屏幕
  52. XDSoft 说:
  53. 最好让它自己点插入点
  54. XDSoft 说:
  55. 然后把这个插入点做屏幕中心
  56. XDSoft 说:
  57. 找个适当的比例,比如屏幕高度的几倍
  58. eachy 说:
  59. 直接给插入点看不到块
  60. ...
  61. XDSoft 说:
  62. 可以先用程序把block插入进来
  63. XDSoft 说:
  64. 不执行完 就ctrl+c
  65. eachy 说:
  66. 这和天正的插图框一样,推动的时候已经看到块了
  67. XDSoft 说:
  68. 插入点先按0,0插入,提示完后直接CTRL+C
  69. XDSoft 说:
  70. 然后程序在让它自己选插入点
  71. eachy 说:
  72. 这有个问题,有的块的basepoint可能和图形相距很远
  73. XDSoft 说:
  74. 这就要求他做块的时候注意了
  75. eachy 说:
  76. 如果块是别人做的呢?
  77. ...
  78. eachy 说:
  79. 或者是别人的图
  80. XDSoft 说:
  81. 那用API XDRX_OBJECT_GET
  82. XDSoft 说:
  83. 得到块的实体的框
  84. eachy 说:
  85. 程序还是用块的中心
  86. XDSoft 说:
  87. 找最下点 重新定义块
  88. XDSoft 说:
  89. 这样也不好,因为既然想用块
  90. XDSoft 说:
  91. 一定是配合插入点的
  92. XDSoft 说:
  93. 比如家具什么的
  94. XDSoft 说:
  95. 给乱改了,就不好了
  96. XDSoft 说:
  97. AUTOCAD插入也是这样的
  98. XDSoft 说:
  99. 离开很远,也看不到
  100. ...
  101. eachy 说:
  102. 我的意思是判断一下,如果插入点离图远就用块中心,否则用插入点
  103. XDSoft 说:
  104. 让他自己用关键字选择吧
  105. XDSoft 说:
  106. 别自动判断
  107. eachy 说:
  108. 中心时用entity_box
  109. ...
  110. XDSoft 说:
  111. 可能不同的时候用不同的程序
  112. ...
  113. XDSoft 说:
  114. 屏幕缩放的考虑下
  115. ...
  116. XDSoft 说:
  117. 或者插入后
  118. XDSoft 说:
  119. 找到块的框的左下点
  120. XDSoft 说:
  121. 从左下点移动到屏幕内,适当缩放
  122. XDSoft 说:
  123. 然后开始拖动
  124. XDSoft 说:
  125. 默认是1:1那么大
  126. XDSoft 说:
  127. 先移动,然后缩放,然后旋转
  128. XDSoft 说:
  129. 要同时允许输入 数字
  130. eachy 说:
  131. 和insert的顺序一样
  132. ...
  133. XDSoft 说:
  134. 线框拖动和实际显示做一起吧
  135. XDSoft 说:
  136. 用个关键字,让用户输入
  137. XDSoft 说:
  138. 程序记住上次的输入,放到默认的回车里面
  139. XDSoft 说:
  140. 真是越来越大了
  141. ...
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2002-3-28 15:11:30 | 显示全部楼层
程序用到的dragsscale对实际显示没有问题,但对轮廓显示时拖动的框非常小?请XD解释了.
  1. xdrx_dragsscale


  2. 功    能:用鼠标动态(拖动)缩放选择集,不实际缩放,只是模拟AUTOCAD scale命令的情形。

  3. 调用格式:(xdrx_dragsscale <提示串> <选择集> <基点> [当前图形的出图比例])

  4. 参数说明:[当前图形的出图比例]:可以缺省,默认值是1000 (即出图比例是1:100)
  5.           若按1:1出图,请直到此值为1
  6.           因为,AUTOCAD 只是在1:1情况下,命令scale才能用显示出鼠标动态
  7.           拖动的效果。而我们常用的绘图习惯是1:100,所以默认值设置成1000.

  8. 返 回 值:返回缩放后的比例系数。当不拖动,可以直接输入缩放的比例,此时,返回值是
  9.           比例值的字符串。
  10.           直接回车,返回NIL。

  11. 示    例:请按1:100绘图
  12.         (setq ss (ssget))
  13.         (setq pt (getpoint "\n基点"))
  14.         (if (setq r (sort1 "\n再输入切割图的放大比例 <1>: " ss p1))
  15.             (progn
  16.                 (if (='STR (type r))
  17.                     (setq r (atof r))
  18.                 )
  19.                 (if (= r 0)
  20.                     (setq r 1)
  21.                 )
  22.                 (command ".scale" ss "" p1 (abs r))
  23.             )
  24.         )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-3-28 15:15:55 | 显示全部楼层
使用中出现图形重新生成时,拖动效果不执行!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-20 13:46 , Processed in 0.381957 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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