明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3228|回复: 6

实体中心缩放

[复制链接]
发表于 2011-2-26 19:37 | 显示全部楼层 |阅读模式
前几天收到明经通道一个朋友发了短消息,求助原位缩放,不知道原位缩放是否指视图中心缩放?
暂且发一个视图中心缩放的源码和大家讨论:

  1. (defun c:mysc (/ sc ss i en ent pts pt s1)
  2.   ;;出错处理函数
  3.   (defun ss-errexit (msg)
  4.     (command)
  5.     (command)
  6.     (if (or (= msg "Function cancelled")
  7.      (= msg "quit / exit abort")
  8. )
  9.       (princ msg)
  10.       (princ (strcat "\n错误: " msg))
  11.     )
  12.     (clos)
  13.   )
  14.   (svos)
  15.   (setq sc (getreal "\n请输入缩放比例<1.0>:"))
  16.   (if (null sc)
  17.     (setq sc 1.0)
  18.   )
  19.   (setq ss (ssget))
  20.   (setq i -1)
  21.   (setvar "OSMODE" 0)
  22.   (while (setq en (ssname ss (setq i (1+ i))))
  23.     (setq pt (ss-getencen en NIL))
  24.     (ss-en-scale en pt sc)
  25.   )
  26.   (clos)
  27. )
  28. (princ "\n高山流水图元中心缩放程序,命令mysc")
  29. (princ)
  30. ;;;获取图元的视图中心
  31. (defun ss-getencen (en onseg / Wmat Umat obj minPt maxPt)
  32.   (if (and onseg (= (getvar "WORLDUCS") 0))
  33.     (setq Wmat (gc:TMatrixFromTo 1 0)
  34.    Umat (gc:TMatrixFromTo 0 1)
  35.     )
  36.   )
  37.   (if en
  38.     (progn
  39.       (setq obj (vlax-ename->vla-object en))
  40.       (if Wmat
  41. (vla-TransformBy obj (vlax-tmatrix Wmat))
  42.       )
  43.       (vla-GetBoundingBox obj 'minpt 'maxpt)
  44.       (setq minPt (vlax-safearray->list minPt))
  45.       (setq maxPt (vlax-safearray->list maxPt))
  46.       (if Umat
  47. (vla-TransformBy obj (vlax-tmatrix Umat))
  48.       )
  49.       (midpt minpt maxpt)
  50.     )
  51.   )
  52. )
  53. ;;;gile
  54. (defun gc:TMatrixFromTo (from to)
  55.   (append
  56.     (mapcar
  57.       (function
  58. (lambda (v o)
  59.    (append (trans v from to T) (list o))
  60. )
  61.       )
  62.       (list '(1. 0. 0.) '(0. 1. 0.) '(0. 0. 1.))
  63.       (trans '(0. 0. 0.) to from)
  64.     )
  65.     (list '(0. 0. 0. 1.))
  66.   )
  67. )
  68. ;;;图元基点缩放
  69. (defun ss-en-scale (en pt sc / s1)
  70.   (setq s1 (ssadd)
  71. s1 (ssadd en s1)
  72.   )
  73.   (vl-cmdf "_.SCALE" s1 "" pt sc)
  74. )
  75. ;;;保存原来的设定
  76. (defun svos ()
  77. ;;;记录初始变量
  78.   (setq gsls_oldosm    (getvar "OSMODE") ;捕捉设定
  79. gsls_oldoth    (getvar "ORTHOMODE") ;正交设定
  80. gsls_oldlye    (getvar "CLAYER") ;当前层
  81. gsls_oldclr    (getvar "CECOLOR") ;当前颜色
  82. gsls_plnwid    (getvar "PLINEWID") ;线宽设定
  83. gsls_oldltp    (getvar "CELTYPE") ;保存当前线形
  84. gsls_cmdecho   (getvar "CMDECHO") ;命令形式
  85. gsls_elev      (getvar "ELEVATION")
  86. gsls_pickstyle (getvar "PICKSTYLE")
  87. gsls_olderr    *error*
  88. *error*        ss-errexit
  89.   )
  90.   (vla-startundomark
  91.     (vla-get-activedocument (vlax-get-acad-object))
  92.   )
  93. )
  94. ;;;恢复原来的设定
  95. (defun clos ()
  96.   (vla-EndUndoMark
  97.     (vla-get-ActiveDocument (vlax-get-acad-object))
  98.   )
  99.   (setvar "OSMODE" gsls_oldosm)
  100.   (setvar "ORTHOMODE" gsls_oldoth)
  101.   (setvar "CLAYER" gsls_oldlye)
  102.   (setvar "CECOLOR" gsls_oldclr)
  103.   (setvar "CELTYPE" gsls_oldltp)
  104.   (setvar "ELEVATION" gsls_elev)
  105.   (setvar "CMDECHO" gsls_cmdecho)
  106.   (setvar "PLINEWID" gsls_plnwid)
  107.   (setvar "PICKSTYLE" gsls_pickstyle)
  108.   (setq *error* gsls_olderr)
  109.   (prin1)
  110. )
  111. ;;;求两点中点
  112. (defun midpt (pta ptb)
  113.   (mapcar (function (lambda (x y)
  114.         (/ (+ x y) 2.0)
  115.       )
  116.    )
  117.    pta
  118.    ptb
  119.   )
  120. )


本帖被以下淘专辑推荐:

  • · excel|主题: 80, 订阅: 2
发表于 2011-2-26 19:44 | 显示全部楼层
能不能以图形的形心,原位置放大缩小
发表于 2011-2-26 19:56 | 显示全部楼层
  1. ;; 保存原来的设定
  2. (defun svos ()
  3.   (setq        #system#    '("OSMODE" "ORTHOMODE" "CLAYER" "CECOLOR" "PLINEWID" "CELTYPE" "CMDECHO" "ELEVATION" "PICKSTYLE")
  4.         #vlale#            (mapcar 'getvar #system#)
  5.         gsls_olderr *error*
  6.         *error*            ss-errexit
  7.   )
  8.   (vla-startundomark
  9.     (vla-get-activedocument (vlax-get-acad-object))
  10.   )
  11. )
  12. ;; 恢复原来的设定
  13. (defun clos ()
  14.   (vla-EndUndoMark
  15.     (vla-get-ActiveDocument (vlax-get-acad-object))
  16.   )
  17.   (MapCar 'setvar #system# #vlale#)
  18.   (setq *error* gsls_olderr)
  19. )

  20. ;; 求两点中点
  21. (defun midpt (pta ptb)
  22.   (mapcar '(lambda (x y) (/ (+ x y) 2.0)) pta ptb)
  23. )
 楼主| 发表于 2011-2-26 21:11 | 显示全部楼层
谢谢院长指导!系统变量保存原本想采用AC_BONUS的表形式,但是由于使用不多,为了方便,就没有再修改了。
2楼朋友,如果要使用形心放大,那就必须是存在形心的实体
发表于 2011-9-16 11:17 | 显示全部楼层
请问一下,我用的cad2010,楼主的程序放到vlisp里面出错


_$
; 错误: 参数类型错误: FILE nil
_$
发表于 2012-7-1 19:35 | 显示全部楼层
如果是参照基点缩放就好哈~
发表于 2014-12-30 12:25 | 显示全部楼层
这个很好用!谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 14:19 , Processed in 0.541748 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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