明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1990|回复: 13

[源码] vqrec : 布局中指定矩形视口,再连续指定切分区域---command版

[复制链接]
发表于 2021-4-10 13:58:24 | 显示全部楼层 |阅读模式
本帖最后由 masterlong 于 2021-4-10 19:25 编辑

源码见2楼
顺便求一下非command程序


程序应用场景说明

图1

图2


图1中的建筑底图是厂房的屋面
实际设计内容仅楼梯间和电梯机房
椭圆圈的几个很小的区域
设计人偷懒直接套了一个A0加长图框
中间图就算了
但是正式出图肯定不能这样
现在需要把有效区域重做视口
再合并到其它平面中图2是合并后的效果


本身我编了一个程序
用于在模型绘制多个矩形直接生成视口
但是模型布局切换实在太慢了
而这个项目里这样操作的需求量是非常非常大
于是有了这样一个程序
直接在已有视口的基础上
切分出多个新视口





本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2021-4-10 13:59:28 | 显示全部楼层
;;;;;;vqrec : 布局中指定矩形视口,再连续指定切分区域
(defun c:vqrec()
(princ "\nvqrec : 布局中指定矩形视口,再连续指定切分区域")(princ)
(command "undo" "g")

(setq p1p2list NIL)
(if (and
    (setq ss (ssget ":e:s" '((0 . "VIEWPORT"))))
    (setq vpent (ssname ss 0))
    (setq vpentlist (list vpent))
    (zooment vpent 2)
    ;;获取视口的第1、3角点
    (setq vcen (dxf 10 vpent))
    (setq vhw (/ (dxf 40 vpent) 2.0))
    (setq vhh (/ (dxf 41 vpent) 2.0))
    (setq ptvp1 (list (- (car vcen) vhw) (- (cadr vcen) vhh))) ;;原视口右下点
    (setq ptvp2 (list (+ (car vcen) vhw) (+ (cadr vcen) vhh))) ;;原视口左上点
    ;;获取当前屏幕高度,取二百分之一作为框选的尺寸
    (setq size (/ (getvar "viewsize") 200.0))
    ;;获取ptvp1、ptvp2的框选点
    (setq ptvp1a (list (+ (car ptvp1) size) (+ (cadr ptvp1) size))
      ptvp1b (list (- (car ptvp1) size) (- (cadr ptvp1) size))
    )
    (setq ptvp2a (list (+ (car ptvp2) size) (+ (cadr ptvp2) size))
      ptvp2b (list (- (car ptvp2) size) (- (cadr ptvp2) size))
    )
  )
  (vqrec_getp1p2)
)

(command "undo" "e")
(princ)
)
(defun vqrec_getp1p2()
(if (and
    (setq p1 (getpoint "\n指定切分区域第1点 / <右键退出> : "))
    (setq p2 (getcorner p1 " ok   指定切分区域第2点 / <右键退出> : "))
    (princ " ok ")
   )
   (progn
    (setq p1p2list (cons (list p1 p2) p1p2list))
    (command "rectang" "non" p1 "non" p2)
    (redraw (entlast) 3)
    (setq vpentlist (cons (entlast) vpentlist))
    (vqrec_getp1p2)
   )
   (if p1p2list
    (progn
     (foreach p1p2 p1p2list
      (zooment vpent 2)
      (command "copy" vpent "" "non" "0,0" "non" "0,0")
      (redraw vpent 2)
      (setq p1 (car  p1p2))
      (setq p2 (cadr p1p2))
      
          ;;;;
          ;;;;vla方法暂时无法实现目的,尝试使用command实现视口角点的拉伸-----成功
          ;;;;
          (command "STRETCH" "c" "non" ptvp1a "non" ptvp1b "" "non" ptvp1 "non" p2)
          (command "STRETCH" "c" "non" ptvp2a "non" ptvp2b "" "non" ptvp2 "non" p1)
          (redraw vpent 1)
     )
     (foreach x vpentlist (entdel x))
     (princ "\n视口已根据指定区域切分完成")
    )
    (princ "未绘制矩形,程序结束")
   )
)
(princ)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;--------------公共函数
;999公共函数
;;以指定图元中心缩放窗口
(defun zooment( ent sc / box x midpo h pa pb )
(vla-getboundingbox (vlax-Ename->Vla-Object ent) 'll 'ur)
(setq box (mapcar 'vlax-safearray->list (list ll ur)))
(setq midpo (getmidpo box))
(setq h (abs (- (cadr (cadr box)) (cadr (car box)))))
(setq h (* h (sqrt sc)))
;;;;(vla-zoomwindow (vlax-get-acad-object) (vlax-3d-point pa) (vlax-3d-point pb))
(vla-ZoomCenter  (vlax-get-acad-object) (vlax-3d-point midpo) h)
box
)
;999公共函数
;;求点对中点
(defun getmidpo( pts / P1 P2 X Y )
(setq p1 (car pts) p2 (cadr pts))
(if (= (length p1) (length p2))
  nil
  (setq p1 (list (car p1) (cadr p1))
    p2 (list (car p2) (cadr p2))
  )
)
(mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) P1 P2)
)
;999公共函数
;;dxf  获取图元某个dxf组码(内参不限种类顺序::: n ent [entget ent] )
(defun dxf( n ent / temp tmp )
(if (/= (type n) 'int)
  (setq temp  ent
    ent n  
    n  temp
  )
)
(if (= (type ent) 'ENAME)
  (setq temp (entget ent))
  (setq temp ent)
)
(if (= n 62)
  (if (setq tmp (assoc n temp))  (cdr tmp)  256)
  (cdr (assoc n temp))
)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;--------------公共函数
 楼主| 发表于 2021-4-10 14:02:15 | 显示全部楼层
本来想用vla函数改变视口
但是解决不了模型“视点”随视口中心“平移”的问题
无奈采用command的拉伸命令实现需求
下面是未完成的代码
期待高手完善

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;--------------不能实现目标的vla代码
(defun c:vr4()
        (setq ss (ssget ":e:s" '((0 . "VIEWPORT"))))
        (setq vpent (ssname ss 0))
        (setq newobj (vlax-Ename->Vla-Object vpent))
        (setq CustomScale (vla-get-CustomScale newobj))
        (setq 12dxf (dxf 12 vpent))
       
        (setq p1 (getpoint "\n指定切分区域第1点 / <右键退出> : "))
        (setq p2 (getcorner p1 " ok   指定切分区域第2点 / <右键退出> : "))
        (princ " ok ")

        (setq pt (mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) P1 P2))
        (setq xdist (abs (- (car  p1) (car  p2))))
        (setq ydist (abs (- (cadr p1) (cadr p2))))
                       
        (vla-put-width newobj xdist)
        (vla-put-height newobj ydist)
        (vla-put-center newobj (vlax-3D-Point pt))
        (vla-put-CustomScale  newobj CustomScale)
       
        ;|
        ...........                ;;怎么保持模型不随视口中心“平移” ?????
        |;
                                               
(princ)
)
发表于 2021-4-12 14:11:34 | 显示全部楼层
本帖最后由 叮咚 于 2021-4-12 14:12 编辑

http://www.lee-mac.com/vpoutline.html
可以参考lee mac这个程序,先把画的矩形反到模型空间中,找到中心点。也就是下面代码的中心 vpt
  1. (defun ttx(ptcen vpt ww dd ang blx)

  2.   ;(setq ptcenx (mapcar '(lambda(xx)(/ xx 1.0 blx)) ptcen))
  3.   (setq obj_mv (vlax-invoke-method aps "AddPViewport" (vlax-3D-point ptcen) (+ (/ ww blx) 0.0) (+ (/ hh blx) 0.0)))
  4.   (vlax-put-property obj_mv "Layer" "0-视口")
  5.   (vlax-put-property obj_mv "Color" acYellow)
  6.   (vlax-put-property obj_mv "ViewportOn" acTrue)
  7.   (vlax-put-property obj_mv "TwistAngle" (* -1 ang))
  8.   (vlax-put-property obj_mv "GridOn" acFalse)
  9.   ; ActivePViewport示例中有以下说明
  10.   ;' 在将图纸空间 Viewport 设为活动前,mspace 属性必须为 True
  11.   ;  ThisDrawing.mspace = True
  12.   ;  ThisDrawing.ActivePViewport = newPViewport
  13.   (vlax-put-property adoc_l "ActiveSpace" acPaperspace)
  14.   (vlax-invoke-method (vlax-get-property acad_l "Application") "ZoomExtents")
  15.   (vlax-put-property adoc_l "MSpace" acTrue)
  16.   (vlax-put-property adoc_l "ActivePViewport" obj_mv)
  17.   ;(vlax-put-property adoc_l "ActivePViewport" obj_mv)
  18.   (vlax-invoke-method (vlax-get-property acad_l "Application") "ZoomCenter" (vlax-3D-point vpt) 1.0)
  19.   (vlax-put-property adoc_l "MSpace" acFalse)
  20.   (vlax-put-property obj_mv "CustomScale" (/ 1.0 blx))
  21.   ;(vlax-invoke-method (vlax-get-property acad_l "Application") "ZoomPrevious")

  22. )


发表于 2021-4-11 22:49:09 | 显示全部楼层
找时间我们聊聊这个问题吧
 楼主| 发表于 2021-4-12 09:02:46 | 显示全部楼层
论坛里参照、视口相关的程序
还是太少了
一直想把自己的一些程序放上来
等有空时整理整理
 楼主| 发表于 2021-4-12 14:37:11 | 显示全部楼层
计算拉伸后视口对应的模型中心点
这个不难
问题是怎么修改
vla貌似没有方法
entmod对视口图元好像也无效
 楼主| 发表于 2021-4-12 14:53:48 | 显示全部楼层
我好像走入误区了?
进入到视口内部
直接vla-ZoomCenter
就不知道速度方面怎么样
等会测试下
发表于 2021-4-12 15:13:16 | 显示全部楼层
masterlong 发表于 2021-4-12 14:53
我好像走入误区了?
进入到视口内部
直接vla-ZoomCenter

对啊,我发你的代码中,就是这样啊
 楼主| 发表于 2021-4-13 12:00:20 | 显示全部楼层
初步测试
感觉进入视口zoom中心点的做法
比直接视口拉伸要慢好多
差不多1:2的关系

command方式
copy以前先冻结全部图层
拉伸全部完成以后再恢复图层
时间上又能省一半

当然耗时这个不好说
这和模型图元数量
布局视口数量以及切分数量等等
都有很大的关系

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

本版积分规则

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

GMT+8, 2024-11-15 10:50 , Processed in 0.200813 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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