明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2366|回复: 9

[运行时] [求助]为什么无法实现缩放呢

[复制链接]
发表于 2010-4-19 17:59 | 显示全部楼层 |阅读模式

Public Class Class1

    <CommandMethod("sf")> Public Sub 缩放()
        Dim Acaddoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim Db As Database = Acaddoc.Database
        Dim Ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

        Using trans As Transaction = Db.TransactionManager.StartTransaction
            Try
                Dim bt As BlockTable = trans.GetObject(Db.BlockTableId, OpenMode.ForRead)
                Dim btr As BlockTableRecord = trans.GetObject(bt.Item(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
                Dim a As Point2d = New Point2d(0, 0)
                Dim b As Point2d = New Point2d(5, 5)
                Dim ZW As View = New View()
                ZW.ZoomWindow(a, b)
            Catch
                Ed.WriteMessage("Error")
            End Try
            trans.Commit()
        End Using
    End Sub

发表于 2010-4-19 18:47 | 显示全部楼层
 楼主| 发表于 2010-4-20 08:57 | 显示全部楼层

谢谢。不过这样比vba麻烦多了。

发表于 2010-4-20 17:33 | 显示全部楼层

做成函数调用就不复杂了

NetApi的代码看上去是比VBA复杂,但功能也比VBA强多了

发表于 2010-4-20 22:34 | 显示全部楼层
我同意飞狐兄的看法。 用了C#。你才知道什么叫强。
发表于 2010-4-26 09:11 | 显示全部楼层

学习

发表于 2010-4-27 12:04 | 显示全部楼层
AutoCAD .NET 开发人员手册 中
  1. Imports Autodesk.AutoCAD.ApplicationServicesImports Autodesk.AutoCAD.DatabaseServicesImports Autodesk.AutoCAD.RuntimeImports Autodesk.AutoCAD.Geometry    Public Sub Zoom(ByVal pMin As Point3d, ByVal pMax As Point3d, _                ByVal pCenter As Point3d, ByVal dFactor As Double)  '' Get the current document and database  Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument  Dim acCurDb As Database = acDoc.Database      Dim nCurVport As Integer = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT"))      '' Get the extents of the current space when no points   '' or only a center point is provided  '' Check to see if Model space is current  If acCurDb.TileMode = True Then      If pMin.Equals(New Point3d()) = True And _          pMax.Equals(New Point3d()) = True Then              pMin = acCurDb.Extmin          pMax = acCurDb.Extmax      End If  Else      '' Check to see if Paper space is current      If nCurVport = 1 Then          If pMin.Equals(New Point3d()) = True And _             pMax.Equals(New Point3d()) = True Then                  pMin = acCurDb.Pextmin              pMax = acCurDb.Pextmax          End If      Else          '' Get the extents of Model space          If pMin.Equals(New Point3d()) = True And _             pMax.Equals(New Point3d()) = True Then                  pMin = acCurDb.Extmin              pMax = acCurDb.Extmax          End If      End If  End If      '' Start a transaction  Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()      '' Get the current view      Using acView As ViewTableRecord = acDoc.Editor.GetCurrentView()          Dim eExtents As Extents3d              '' Translate WCS coordinates to DCS          Dim matWCS2DCS As Matrix3d          matWCS2DCS = Matrix3d.PlaneToWorld(acView.ViewDirection)          matWCS2DCS = Matrix3d.Displacement(acView.Target - Point3d.Origin) * matWCS2DCS          matWCS2DCS = Matrix3d.Rotation(-acView.ViewTwist, _                                         acView.ViewDirection, _                                         acView.Target) * matWCS2DCS              '' If a center point is specified, define the           '' min and max point of the extents          '' for Center and Scale modes          If pCenter.DistanceTo(Point3d.Origin) <> 0 Then              pMin = New Point3d(pCenter.X - (acView.Width / 2), _                                 pCenter.Y - (acView.Height / 2), 0)                  pMax = New Point3d((acView.Width / 2) + pCenter.X, _                                 (acView.Height / 2) + pCenter.Y, 0)          End If              '' Create an extents object using a line          Using acLine As Line = New Line(pMin, pMax)              eExtents = New Extents3d(acLine.Bounds.Value.MinPoint, _                                       acLine.Bounds.Value.MaxPoint)          End Using              '' Calculate the ratio between the width and height of the current view          Dim dViewRatio As Double          dViewRatio = (acView.Width / acView.Height)              '' Tranform the extents of the view          matWCS2DCS = matWCS2DCS.Inverse()          eExtents.TransformBy(matWCS2DCS)              Dim dWidth As Double          Dim dHeight As Double          Dim pNewCentPt As Point2d              '' Check to see if a center point was provided (Center and Scale modes)          If pCenter.DistanceTo(Point3d.Origin) <> 0 Then              dWidth = acView.Width              dHeight = acView.Height                  If dFactor = 0 Then                  pCenter = pCenter.TransformBy(matWCS2DCS)              End If                  pNewCentPt = New Point2d(pCenter.X, pCenter.Y)          Else '' Working in Window, Extents and Limits mode              '' Calculate the new width and height of the current view              dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X              dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y                  '' Get the center of the view              pNewCentPt = New Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5), _                                       ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5))          End If              '' Check to see if the new width fits in current window          If dWidth > (dHeight * dViewRatio) Then dHeight = dWidth / dViewRatio              '' Resize and scale the view          If dFactor <> 0 Then              acView.Height = dHeight * dFactor              acView.Width = dWidth * dFactor          End If              '' Set the center of the view          acView.CenterPoint = pNewCentPt              '' Set the current view          acDoc.Editor.SetCurrentView(acView)      End Using          '' Commit the changes      acTrans.Commit()  End UsingEnd Sub
  1. [CommandMethod("ZoomWindow")]static public void ZoomWindow(){  // Zoom to a window boundary defined by 1.3,7.8 and 13.7,-2.6  Point3d pMin = new Point3d(1.3, 7.8, 0);  Point3d pMax = new Point3d(13.7, -2.6, 0);    Zoom(pMin, pMax, new Point3d(), 1);}
复制代码
发表于 2010-4-27 12:19 | 显示全部楼层

有点不明白的是:

为什么这个不行??

“对象浏览器”查找"zoomwindow"

public void ZoomWindow(Autodesk.AutoCAD.Geometry.Point2d lowerLeft, Autodesk.AutoCAD.Geometry.Point2d upperRight)
    Autodesk.AutoCAD.GraphicsSystem.View 的成员

发表于 2010-4-27 12:29 | 显示全部楼层

是不是因为类似 Active 方法。使用zoomwindow方法的对象为MSITStore:D:\统统收集\书籍学习\acadauto.chm::/idh_application_object.htm">Application

我记得这个好像要用COM调用。

object.ZoomWindow LowerLeft, UpperRight

Object

MSITStore:D:\统统收集\书籍学习\acadauto.chm::/idh_application_object.htm">Application
使用该方法的对象。

LowerLeft

Variant[变体] (三元素双精度数组); 仅用于输入
显示窗口矩形的左下角坐标。

UpperRight

Variant[变体] (三元素双精度数组); 仅用于输入
显示窗口矩形的右上角坐标。

说明

该方法仅仅在当前活动视口(模型空间或图纸空间)有效。

发表于 2010-4-27 12:35 | 显示全部楼层

找到了:

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75669

          AcadApplication acadApp =
     (AcadApplication)Application.AcadApplication;
            acadApp.ZoomWindow(...

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

本版积分规则

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

GMT+8, 2024-5-10 08:35 , Processed in 0.153974 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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