明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: lwhcommon

[求助]谁能帮我解决:如何编程使预览居中的问题?

  [复制链接]
 楼主| 发表于 2005-12-26 19:06:00 | 显示全部楼层

龙龙仔,不好意思,还是初学者的我没有完全理解你的方法.

我有以下几点疑问:

在屏幕上选取的两个点不能作为包围框吗?

物体的包围框是不是一定要用你说的那个函数(ACET-GEOM-SS-EXTENTS (ssget) t))才能获得?

获得了包围框以后怎样才能让预览居中呢?

你能不能说的详细一点呀?

发表于 2005-12-27 08:02:00 | 显示全部楼层
本帖最后由 作者 于 2005-12-27 14:59:01 编辑

在荧幕上选取的两个点不能作为包围框吗?

=>可以,但物体要居中就靠你框选的范围,当然它不会太准

物体的包围框是不是一定要用你说的那个函数(ACET-GEOM-SS-EXTENTS (ssget) t))才能获得?

=>ACET-GEOM-SS-EXTENTSET中的函数,使用上比较简单,你也可以自己写个函数来求物体的包围框

获得了包围框以后怎样才能让预览居中呢?

=>ACET-GEOM-SS-EXTENTS求的是对角点,所以代入你的PT1 PT2(但记得要ZOOM……)

就等你写出来!  8-)

;;选择N个区域,然后对N个区域内的图形进行居中预览

;;(PVIEW <RINTER NAME>)

;;(PVIEW "HP LaserJet 8000 Series")
;;此处应根据实际情况修改来设置打印设备

 

本帖子中包含更多资源

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

x
 楼主| 发表于 2005-12-28 19:47:00 | 显示全部楼层
呵呵,今天终于解决了预览居中的问题.原来仅仅依靠自动居中有时候是不灵的,还是要手工计算PlotOrigin的偏移量.
我在原程序上加入了手工计算PlotOrigin偏移量(offsetx offsety)的部分,就可以预览居中了.不过这仅仅是对于acscaletofit的情况,其他情况计算原理都一样.
 楼主| 发表于 2005-12-28 19:49:00 | 显示全部楼层

;;;;;;;修改后的程序;;;;;;;;;;;
(defun c:test ()
  (vl-load-com)
  (vl-cmdf "_.ucs" "_world")
  (setq clayout
  (vla-item (vla-get-layouts
       (vla-get-activedocument (vlax-get-acad-object))
     )
     "Model"
  )
  )

  (vla-put-configname clayout "\\\\PC-127\\HP LJ8100 PS") ;此处应根据实际情况修改来设置打印设备
  ;(vla-get-configname clayout )

  (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))))
  ;---------------------
  (vla-put-paperunits clayout acMillimeters)
  (vla-getpapersize clayout 'width 'height)
  (if (> height width)
    (setq pmax height pmin width)
    (setq pmax width pmin height)
  )
  ;---------------------

  (setq number 5 )
  (setq i 0 points '() pointsT '())
  (while (< i number)
    (setq pt1 (getpoint "\n 1st point :"))
    (setq pt2 (getcorner pt1 "\n 2st point :"))
    (setq pointsT (list pt1 pt2))
    (setq points (cons pointsT points))
    (setq i (+ i 1))
  )
    ;
  (setq points (reverse points))
  (setq i 0)
  (while (< i number)
    (setq pt1 (car (nth i points))
          pt2 (cadr (nth i points))
    )
    (setq p1 (vlax-make-safearray vlax-vbdouble '(1 . 2)))
    (vlax-safearray-fill p1 (list (car pt1) (cadr pt1)) )
    (setq p2 (vlax-make-safearray vlax-vbdouble '(1 . 2)))
    (vlax-safearray-fill p2 (list (car pt2) (cadr pt2)) )
    ;
    (vla-setwindowtoplot clayout p1 p2)
    (vla-put-plottype clayout acwindow )
    ;
    ;---------------
    (if (< (car pt1) (car pt2)) (setq minx (car pt1)) (setq minx (car pt2)) )
    (if (< (cadr pt1) (cadr pt2)) (setq miny (cadr pt1)) (setq miny (cadr pt2)) )

    (setq dx (abs (- (car pt1) (car pt2) ))
          dy (abs (- (cadr pt1) (cadr pt2) ))
    )
    (if (> dx dy)
        (setq mmax  dx mmin dy )
        (setq mmax  dy mmin dx )     
    )
    (setq ratio_max (/ mmax pmax)
          ratio_min (/ mmin pmin)
    )

    (if (> ratio_max ratio_min)
        (progn
           (setq ratio ratio_max )
           (setq offsetx (- pmin (/ mmin ratio)) )
           (setq offsetx (/ offsetx 2.0)  offsety 0)
        )
        (progn
           (setq ratio ratio_min )
           (setq offsety (- pmax (/ mmax ratio)) )
           (setq offsety (/ offsety 2.0)  offsetx 0)
        )
    )

  (setq newValue (vlax-make-safearray vlax-vbDouble '(1 . 2)))
  (vlax-safearray-fill newValue  (list offsetx offsety )  )
  (vla-put-PlotOrigin clayout newValue)
  ;---------------
    ;
    (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)
    ;
    (setq i (+ i 1))
  )
  ;
  (vl-cmdf "_.ucs" "_P")
  (prin1)
);主程序结束

 楼主| 发表于 2005-12-28 19:51:00 | 显示全部楼层

不过还是要谢谢你,龙龙仔,非常感谢你这几天的指导!

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

发表于 2005-12-29 08:03:00 | 显示全部楼层
  1. ;;你的居中与我的居中定义不同,我的是EXTEND居中
  2. ;;sld文件是不能包进VLX的
  3. ;;选择N个区域,然后对N个区域内的图形进行居中预览
  4. ;;(PVIEW "HP LaserJet 8000 Series")
  5. (defun PVIEW (NAME     / BLK_BOUND   CLAYOUT  CPLOT
  6.        HOLDECHO HOLDOSMODE  I   P1    P2
  7.        POINTS   POINTST PT1  PT2   PV1    PV2
  8.       )
  9.   (vl-load-com)
  10.   (setq HOLDECHO (getvar "CMDECHO"))
  11.   (setvar "CMDECHO" 0)
  12.   (vl-cmdf "_.ucs" "_world")
  13.   (setq HOLDOSMODE (getvar "OSMODE"))
  14.   (setvar "OSMODE" 0)
  15.   (setq CLAYOUT
  16.   (vla-item (vla-get-layouts
  17.        (vla-get-activedocument (vlax-get-acad-object))
  18.      )
  19.      "Model"
  20.   )
  21.   )
  22.   (vla-put-configname CLAYOUT NAME)
  23.   ;;此处应根据实际情况修改来设置打印设备
  24.   (vla-put-centerplot CLAYOUT :vlax-true)
  25.   (vla-put-canonicalmedianame CLAYOUT "A4")
  26.   (vla-put-plotwithplotstyles CLAYOUT :vlax-true)
  27.   (vla-put-standardscale CLAYOUT acscaletofit)
  28.   (setq CPLOT (vla-get-plot
  29.   (vla-get-activedocument (vlax-get-acad-object))
  30.        )
  31.   )
  32.   (setq I 1
  33. POINTS '()
  34. POINTST '()
  35.   )
  36.   (while (setq PT1 (getpoint "\n 1st point/<EXIT>: "))
  37.     (setq PT2 (getcorner PT1 "\n 2st point: "))
  38.     (setq POINTST (list PT1 PT2))
  39.     (setq POINTS (cons POINTST POINTS))
  40.     (setq I (+ I 1))
  41.   )
  42.   (setq I      0
  43. POINTS (reverse POINTS)
  44.   )
  45.   (while (< I (length POINTS))
  46.     (setq PT1 (car (nth I POINTS))
  47.    PT2 (cadr (nth I POINTS))
  48.     )
  49.     (setq BLK_BOUND (ACET-GEOM-SS-EXTENTS (ssget "C" PT1 PT2) t))
  50.     (setq PT1 (car BLK_BOUND))
  51.     (setq PT2 (cadr BLK_BOUND))
  52.     (command "_.zoom" "W" PT1 PT2)
  53.     (setq P1 (vlax-make-safearray vlax-vbdouble '(1 . 2)))
  54.     (setq PV1 (vlax-make-variant
  55.   (vlax-safearray-fill P1 (list (car PT1) (cadr PT1)))
  56.        )
  57.     )
  58.     (setq P2 (vlax-make-safearray vlax-vbdouble '(1 . 2)))
  59.     (setq PV2 (vlax-make-variant
  60.   (vlax-safearray-fill P2 (list (car PT2) (cadr PT2)))
  61.        )
  62.     )
  63.     (vla-setwindowtoplot CLAYOUT PV1 PV2)
  64.     (vla-put-plottype
  65.       CLAYOUT
  66.       acwindow
  67.     )
  68.     (if (> (abs (- (car PT1) (car PT2)))
  69.     (abs (- (cadr PT1) (cadr PT2)))
  70. )
  71.       (vla-put-plotrotation CLAYOUT ac90degrees)
  72.       (vla-put-plotrotation CLAYOUT ac180degrees)
  73.     )
  74.     (princ "\n preview.....")
  75.     (vla-displayplotpreview CPLOT acfullpreview)
  76.     (command "_.zoom" "p")  ;
  77.     (setq I (+ I 1))
  78.   )
  79.   (vl-cmdf "_.ucs" "_P")
  80.   (setvar "OSMODE" HOLDOSMODE)
  81.   (setvar "CMDECHO" HOLDECHO)
  82.   (prin1)
  83. )     ;
 楼主| 发表于 2005-12-29 18:22:00 | 显示全部楼层

哪请问dcl文件可以吗,肯定是我什么地方没弄对.

我的程序里有(setq dcl_id (load_dialog "test.dcl"))呀?

发表于 2006-1-2 08:13:00 | 显示全部楼层

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

发表于 2009-8-6 23:45:00 | 显示全部楼层

(setq clayout (vla-get-activelayout (vla-get-activedocument (setq AcadObject(vlax-get-acad-object)))))
(setq mpt_drv "Adobe PDF")
(vla-put-configname clayout mpt_drv)
(vla-put-canonicalmedianame clayout "A3")

;;;------------------------------------

(vla-put-canonicalmedianame clayout "Oversize A0")

可想转换为打印A0图纸就出现错误:; 错误: Automation 错误。 输入无效

我想应该是"Oversize A0"字符串中存在空格的缘故,求助帮忙,谢谢!

发表于 2009-8-7 05:48:00 | 显示全部楼层
龙龙仔发表于2005-12-22 7:54:00;;找物件包围外框,看你如何用了!;;程序改好再贴上来好吗?(defun C:BOUND (/ BLK_BOUND PT1 PT2)  (setq BLK_BOUND (ACET-GEOM-SS-EXTENTS (ssget) t))  (setq PT1 (car BLK_BOUND))&

这个真是好用!学习了,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-1 09:36 , Processed in 0.160807 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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