lwhcommon 发表于 2005-12-26 19:06:00

<P>龙龙仔,不好意思,还是初学者的我没有完全理解你的方法.</P>
<P>我有以下几点疑问:</P>
<P>在屏幕上选取的两个点不能作为包围框吗?</P>
<P>物体的包围框是不是一定要用你说的那个函数(ACET-GEOM-SS-EXTENTS (ssget) t))才能获得?</P>
<P>获得了包围框以后怎样才能让预览居中呢?</P>
<P>你能不能说的详细一点呀?</P>

龙龙仔 发表于 2005-12-27 08:02:00

本帖最后由 作者 于 2005-12-27 14:59:01 编辑 <br /><br /> <P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><FONT face=新细明体>在荧幕上选取的两个点不能作为包围框吗</FONT>?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt">=&gt;<FONT face=新细明体>可以</FONT>,<FONT face=新细明体>但物体要居中就靠你框选的范围</FONT>,<FONT face=新细明体>当然它不会太准<o:p></o:p></FONT></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><FONT face=新细明体>物体的包围框是不是一定要用你说的那个函数</FONT>(ACET-GEOM-SS-EXTENTS (ssget) t))<FONT face=新细明体>才能获得</FONT>?<o:p></o:p></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt">=&gt;ACET-GEOM-SS-EXTENTS<FONT face=新细明体>是</FONT>ET<FONT face=新细明体>中的函数</FONT>,<FONT face=新细明体>使用上比较简单</FONT>,<FONT face=新细明体>你也可以自己写个函数来求物体的包围框<o:p></o:p></FONT></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><FONT face=新细明体>获得了包围框以后怎样才能让预览居中呢</FONT>?<o:p></o:p></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt">=&gt;ACET-GEOM-SS-EXTENTS<FONT face=新细明体>求的是对角点</FONT>,<FONT face=新细明体>所以代入你的</FONT>PT<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chmetcnv UnitName="pt" SourceValue="1" HasSpace="True" Negative="False" NumberType="1" TCSC="0" w:st="on">1 PT</st1:chmetcnv>2(<FONT face=新细明体>但记得要</FONT>ZOOM……)</P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 新细明体; mso-ascii-font-family: SimSun; mso-hansi-font-family: SimSun">就等你写出来!<SPAN style="mso-spacerun: yes">&nbsp; 8-)</SPAN></SPAN></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-fareast-font-family: 新细明体">;;选择N个区域,然后对N个区域内的图形进行居中预览</SPAN></P>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-fareast-font-family: 新细明体">;;(PVIEW &lt;PRINTER NAME&gt;)<BR><BR>;;(PVIEW "HP LaserJet 8000 Series")<BR>;;此处应根据实际情况修改来设置打印设备<BR></P></SPAN>
<P style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><o:p></o:p>&nbsp;</P>

lwhcommon 发表于 2005-12-28 19:47:00

呵呵,今天终于解决了预览居中的问题.原来仅仅依靠自动居中有时候是不灵的,还是要手工计算PlotOrigin的偏移量.<BR>我在原程序上加入了手工计算PlotOrigin偏移量(offsetx offsety)的部分,就可以预览居中了.不过这仅仅是对于acscaletofit的情况,其他情况计算原理都一样.

lwhcommon 发表于 2005-12-28 19:49:00

<P>;;;;;;;修改后的程序;;;;;;;;;;;<BR>(defun c:test ()<BR>&nbsp; (vl-load-com)<BR>&nbsp; (vl-cmdf "_.ucs" "_world")<BR>&nbsp; (setq&nbsp;clayout<BR>&nbsp; (vla-item (vla-get-layouts<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-get-activedocument (vlax-get-acad-object))<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp; "Model"<BR>&nbsp; )<BR>&nbsp; )</P>
<P>&nbsp; (vla-put-configname clayout "<A>\\\\PC-127\\HP</A> LJ8100 PS") ;此处应根据实际情况修改来设置打印设备<BR>&nbsp; ;(vla-get-configname clayout )</P>
<P>&nbsp; (vla-put-centerplot clayout :vlax-true)<BR>&nbsp; (vla-put-CanonicalMediaName clayout "A4")<BR>&nbsp; (vla-put-plotwithplotstyles clayout :vlax-true)<BR>&nbsp; (vla-put-standardscale clayout acscaletofit)<BR>&nbsp; (setq cplot (vla-get-plot (vla-get-activedocument (vlax-get-acad-object))))<BR>&nbsp; ;---------------------<BR>&nbsp; (vla-put-paperunits clayout acMillimeters)<BR>&nbsp; (vla-getpapersize clayout 'width 'height) <BR>&nbsp; (if (&gt; height width) <BR>&nbsp;&nbsp;&nbsp; (setq pmax height pmin width)<BR>&nbsp;&nbsp;&nbsp; (setq pmax width pmin height)<BR>&nbsp; )<BR>&nbsp; ;---------------------</P>
<P>&nbsp; (setq number 5 )<BR>&nbsp; (setq i 0 points '() pointsT '())<BR>&nbsp; (while (&lt; i number)<BR>&nbsp;&nbsp;&nbsp; (setq pt1 (getpoint "\n 1st point :"))<BR>&nbsp;&nbsp;&nbsp; (setq pt2 (getcorner pt1 "\n 2st point :"))<BR>&nbsp;&nbsp;&nbsp; (setq pointsT (list pt1 pt2))<BR>&nbsp;&nbsp;&nbsp; (setq points (cons pointsT points))<BR>&nbsp;&nbsp;&nbsp; (setq i (+ i 1))<BR>&nbsp; )<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp; (setq points (reverse points))<BR>&nbsp; (setq i 0)<BR>&nbsp; (while (&lt; i number)<BR>&nbsp;&nbsp;&nbsp; (setq pt1 (car (nth i points))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt2 (cadr (nth i points))<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (setq p1 (vlax-make-safearray vlax-vbdouble '(1 . 2)))<BR>&nbsp;&nbsp;&nbsp; (vlax-safearray-fill p1 (list (car pt1) (cadr pt1)) )<BR>&nbsp;&nbsp;&nbsp; (setq p2 (vlax-make-safearray vlax-vbdouble '(1 . 2)))<BR>&nbsp;&nbsp;&nbsp; (vlax-safearray-fill p2 (list (car pt2) (cadr pt2)) )<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;&nbsp;&nbsp; (vla-setwindowtoplot clayout p1 p2)<BR>&nbsp;&nbsp;&nbsp; (vla-put-plottype clayout acwindow )<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;&nbsp;&nbsp; ;---------------<BR>&nbsp;&nbsp;&nbsp; (if (&lt; (car pt1) (car pt2)) (setq minx (car pt1)) (setq minx (car pt2)) )<BR>&nbsp;&nbsp;&nbsp; (if (&lt; (cadr pt1) (cadr pt2)) (setq miny (cadr pt1)) (setq miny (cadr pt2)) )</P>
<P>&nbsp;&nbsp;&nbsp; (setq dx (abs (- (car pt1) (car pt2) )) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dy (abs (- (cadr pt1) (cadr pt2) ))<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (if (&gt; dx dy)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq mmax&nbsp; dx mmin dy )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq mmax&nbsp; dy mmin dx )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (setq ratio_max (/ mmax pmax)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ratio_min (/ mmin pmin)<BR>&nbsp;&nbsp;&nbsp; )</P>
<P>&nbsp;&nbsp;&nbsp; (if (&gt; ratio_max ratio_min) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ratio ratio_max ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq offsetx (- pmin (/ mmin ratio)) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq offsetx (/ offsetx 2.0)&nbsp; offsety 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ratio ratio_min ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq offsety (- pmax (/ mmax ratio)) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq offsety (/ offsety 2.0)&nbsp; offsetx 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )</P>
<P>&nbsp; (setq newValue (vlax-make-safearray vlax-vbDouble '(1 . 2)))<BR>&nbsp; (vlax-safearray-fill newValue&nbsp; (list offsetx offsety )&nbsp; )<BR>&nbsp; (vla-put-PlotOrigin clayout newValue)<BR>&nbsp; ;---------------<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;&nbsp;&nbsp; (if (&gt; (abs (- (car pt1) (car pt2))) (abs (- (cadr pt1) (cadr pt2))) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-plotrotation clayout ac90degrees)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-plotrotation clayout ac180degrees)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;&nbsp;&nbsp; (princ "\n preview.....")<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;&nbsp;&nbsp; (vla-displayplotpreview&nbsp; cplot acfullpreview)<BR>&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;&nbsp;&nbsp; (setq i (+ i 1))<BR>&nbsp; )<BR>&nbsp; ;<BR>&nbsp; (vl-cmdf "_.ucs" "_P")<BR>&nbsp; (prin1)<BR>);主程序结束</P>

lwhcommon 发表于 2005-12-28 19:51:00

<P>不过还是要谢谢你,龙龙仔,非常感谢你这几天的指导!</P>
<P>龙龙仔,我还有个很简单的问题要请教一下:<BR>我现在有lsp文件,dcl文件和sld文件,怎样才能将这3个文件通过生成应用程序向导生成一个vlx文件,而不再需要dcl文件和sld文件了.<BR>我已经试过了,将dcl文件和sld文件作为资源文件一起生成.但不知为什么如果仅仅将vlx文件拷贝倒默认目录,加载运行后还是提示需要dcl文件和sld文件.</P>

龙龙仔 发表于 2005-12-29 08:03:00


;;你的居中与我的居中定义不同,我的是EXTEND居中
;;sld文件是不能包进VLX的
;;选择N个区域,然后对N个区域内的图形进行居中预览
;;(PVIEW "HP LaserJet 8000 Series")
(defun PVIEW (NAME   / BLK_BOUND   CLAYOUTCPLOT
       HOLDECHO HOLDOSMODEI   P1    P2
       POINTS   POINTST PT1PT2   PV1    PV2
      )
(vl-load-com)
(setq HOLDECHO (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(vl-cmdf "_.ucs" "_world")
(setq HOLDOSMODE (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq CLAYOUT
(vla-item (vla-get-layouts
       (vla-get-activedocument (vlax-get-acad-object))
   )
   "Model"
)
)
(vla-put-configname CLAYOUT NAME)
;;此处应根据实际情况修改来设置打印设备
(vla-put-centerplot CLAYOUT :vlax-true)
(vla-put-canonicalmedianame CLAYOUT "A4")
(vla-put-plotwithplotstyles CLAYOUT :vlax-true)
(vla-put-standardscale CLAYOUT acscaletofit)
(setq CPLOT (vla-get-plot
(vla-get-activedocument (vlax-get-acad-object))
       )
)
(setq I 1
POINTS '()
POINTST '()
)
(while (setq PT1 (getpoint "\n 1st point/<EXIT>: "))
    (setq PT2 (getcorner PT1 "\n 2st point: "))
    (setq POINTST (list PT1 PT2))
    (setq POINTS (cons POINTST POINTS))
    (setq I (+ I 1))
)
(setq I      0
POINTS (reverse POINTS)
)
(while (< I (length POINTS))
    (setq PT1 (car (nth I POINTS))
   PT2 (cadr (nth I POINTS))
    )
    (setq BLK_BOUND (ACET-GEOM-SS-EXTENTS (ssget "C" PT1 PT2) t))
    (setq PT1 (car BLK_BOUND))
    (setq PT2 (cadr BLK_BOUND))
    (command "_.zoom" "W" PT1 PT2)
    (setq P1 (vlax-make-safearray vlax-vbdouble '(1 . 2)))
    (setq PV1 (vlax-make-variant
(vlax-safearray-fill P1 (list (car PT1) (cadr PT1)))
       )
    )
    (setq P2 (vlax-make-safearray vlax-vbdouble '(1 . 2)))
    (setq PV2 (vlax-make-variant
(vlax-safearray-fill P2 (list (car PT2) (cadr PT2)))
       )
    )
    (vla-setwindowtoplot CLAYOUT PV1 PV2)
    (vla-put-plottype
      CLAYOUT
      acwindow
    )
    (if (> (abs (- (car PT1) (car PT2)))
    (abs (- (cadr PT1) (cadr PT2)))
)
      (vla-put-plotrotation CLAYOUT ac90degrees)
      (vla-put-plotrotation CLAYOUT ac180degrees)
    )
    (princ "\n preview.....")
    (vla-displayplotpreview CPLOT acfullpreview)
    (command "_.zoom" "p");
    (setq I (+ I 1))
)
(vl-cmdf "_.ucs" "_P")
(setvar "OSMODE" HOLDOSMODE)
(setvar "CMDECHO" HOLDECHO)
(prin1)
)   ;

lwhcommon 发表于 2005-12-29 18:22:00

<P>哪请问dcl文件可以吗,肯定是我什么地方没弄对.</P>
<P>我的程序里有(setq dcl_id (load_dialog "test.dcl"))呀?</P>

龙龙仔 发表于 2006-1-2 08:13:00

<P>最好能贴上全部程序,不然无法判断</P>

jaminth 发表于 2009-8-6 23:45:00

<p>(setq clayout (vla-get-activelayout (vla-get-activedocument (setq AcadObject(vlax-get-acad-object)))))<br/>(setq mpt_drv "Adobe PDF")<br/>(vla-put-configname clayout mpt_drv)<br/>(vla-put-canonicalmedianame clayout <font color="#ff0000">"A3"</font><font color="#000000">)</font></p><p>;;;------------------------------------</p><p>(vla-put-canonicalmedianame clayout<font color="#ff0000"> "Oversize A0"</font>)</p><p>可想转换为打印A0图纸就出现错误:; 错误: Automation 错误。 输入无效</p><p>我想应该是<font color="#ff0000">"Oversize A0"</font>字符串中存在空格的缘故,求助帮忙,谢谢!</p>

xhq1954425 发表于 2009-8-7 05:48:00

龙龙仔发表于2005-12-22 7:54:00static/image/common/back.gif;;找物件包围外框,看你如何用了!;;程序改好再贴上来好吗?(defun C:BOUND (/ BLK_BOUND PT1 PT2)&nbsp; (setq BLK_BOUND (ACET-GEOM-SS-EXTENTS (ssget) t))&nbsp; (setq PT1 (car BLK_BOUND))&

<p></p>这个真是好用!学习了,谢谢!
页: 1 [2] 3
查看完整版本: [求助]谁能帮我解决:如何编程使预览居中的问题?