研究了好几年的难题、ZOOM+O无法布满视口
本帖最后由 xiaocainiao 于 2022-2-5 19:35 编辑有一个问题研究好久了也没有找到解决方案、就是在视口中使用ZOMM缩放命令中的"O-对象"模式、
想将选择的对象在视口内布满、每次图形都是和视口线差一点无法布满、如下图:
求教一下论坛内的各位大神、看看有没有办法或者相关的变量、
可以用“ZOOM+O”这种模式将对象布满视口
;包围盒才精确,这个取巧能用就用
(defun c:tt ()
(if(setq ss(ssget))
(progn
(command "zoom" "o" ss "")
(command "zoom" "s" "1.029x")
)
)
(princ)
) 你有种再说一遍 发表于 2022-2-5 21:37
喏喏喏喏喏喏喏喏喏
选择矩形布满视口太简单了、用楼上大神的代码都没问题、我现在的问题是选择一些特殊图元不行、找过很多人都没搞定、
你可以试试我发的这个图纸、能不能用你的方法来框选对象布满视口(这个用ZOOM+O是没问题的)、
并且这只是绘图中遇到的几种特殊情况、实际上还有很多特殊情况(比如倾斜的视图状态下布满视口等等){:7_459:}
本帖最后由 guosheyang 于 2022-3-18 13:25 编辑
你这个分成三种情况,带剪裁框的普通块儿,没剪裁框的动态块儿和多行文字三种情况。上面那个是带剪裁框的普通块儿,先用boundingbox函数求出其包围框角点,再画出矩形(范围延伸到块儿基点处),生成面域,然后用xclip命令画出剪裁框矩形,生成面域,再将生成的两个面域求交,即得到显示块儿部分面域,求出角点;对于下面那个动态块,可以先复制一份,然后炸开,再求包围框角点;对于多行文字,可以复制一份,炸开为单行文字,再求文字包围框角点;最后通过三个角点来求出最大的包围框角点(左下角 右上角),这个也是zoom/w 需要的两个点。这个过程中需要的函数论坛上都有现成的,自己搜索下即可,详细的思路就这样,自己动手呗,那样才能提高水平 本帖最后由 和尚777 于 2022-2-1 19:00 编辑
(defun c:tt (/ e p)
(setq e(car(entsel)))
(setq p(GetBox e))
(command "zoom" "non"(car p) "non" (cadr p))
(princ)
)
(defun GetBox (ent / ll ur)
(vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
(mapcar 'vlax-safearray->list (list ll ur))
) 和尚777 发表于 2022-2-1 18:45
(defun c:tt (/ e p)
(setq e(car(entsel)))
(setq p(GetBox e))
谢谢大神回复、祝您新年快乐!不过这个代码对于一些特殊图元不管事、还有就是不能框选、CAD本身的那个ZOOM+O、碰到特殊的像多行文字、裁剪过的图块和其他的一些特殊图元、都能正确识别出边界、所以一直在找有没有啥设置能让ZOOM+O、直接就布满视口 框选就是取所有图元的包围盒点,再取所有点的最大最小点,再zoom,特殊图元一样是取包围盒只是比较难而已 和尚777 发表于 2022-2-1 21:43
框选就是取所有图元的包围盒点,再取所有点的最大最小点,再zoom,特殊图元一样是取包围盒只是比较难而已
我之前也是想的用包围盒、总是碰到各种特殊情况、导致图形在视口内不居中、但是用ZOMM+O就可以、所以现在就是想看有没有办法让ZOOM+O能够精确的布满视口{:7_410:} 和尚777 发表于 2022-2-1 21:45
;包围盒才精确,这个取巧能用就用
(defun c:tt ()
(if(setq ss(ssget))
比例这种方法我也试过、不精确、现在就是找不到CAD本身的规律、试了好多种方法都不行{:7_418:} 需要研究几年吗?修改视口表记录不用cmd'' 你有种再说一遍 发表于 2022-2-5 02:24
需要研究几年吗?修改视口表记录不用cmd''
没太懂你说的是啥意思、不过你可以尝试一下如何用ZOOM+O让对象在视口内居中布满、不用其他方式、其他求对象最大和最小边界那种方法已经找了很多人了、但还是有各种特殊情况无法布满、所以干脆放弃了 xiaocainiao 发表于 2022-2-5 10:04
没太懂你说的是啥意思、不过你可以尝试一下如何用ZOOM+O让对象在视口内居中布满、不用其他方式、其他求对 ...
都说不用命令了,用命令还有啥自由度.
继续学深入点吧