乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 55|回复: 7

[编程交流] 如何利用内置旋转

[复制链接]

2

主题

13

帖子

11

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:05:13 | 显示全部楼层 |阅读模式
你好
 
我们的用户必须能够旋转一系列的线、圆、块等(这导致看起来像一个输送机)。我试图使用AutoCAD的内置旋转命令传递选择集。
 
我在AutoDesk论坛上获得了很多帮助:
http://forums.autodesk.com/t5/net/how-to-pass-objectidcollection-into-built-in-rotate-command/m-p/5429159#M42620
 
我现在似乎陷入了僵局。我没有AutoCAD 2015,所以我使用RunCommand包装器来使用编辑器。命令()。
 
  1. Imports System.Collections.Generic
  2. Imports System.Linq
  3. Imports System.Text
  4. Imports System.Linq.Expressions
  5. Imports System.Reflection
  6. Imports Autodesk.AutoCAD.ApplicationServices
  7. Imports Autodesk.AutoCAD.EditorInput
  8. Module EditorInputExtensionMethods
  9.    <System.Runtime.CompilerServices.Extension()> _
  10.    Public Function Command(editor As Editor, ParamArray args As Object()) As PromptStatus
  11.        If editor Is Nothing Then
  12.            Throw New ArgumentNullException("editor")
  13.        End If
  14.        Return runCommand(editor, args)
  15.    End Function
  16.    Dim runCommand As Func(Of Editor, Object(), PromptStatus) = GenerateRunCommand()
  17.    Private Function GenerateRunCommand() As Func(Of Editor, Object(), PromptStatus)
  18.        Dim method As MethodInfo = GetType(Editor).GetMethod("RunCommand", BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.[Public])
  19.        Dim instance As ParameterExpression = Expression.Parameter(GetType(Editor), "editor")
  20.        Dim args As ParameterExpression = Expression.Parameter(GetType(Object()), "args")
  21.        Return Expression.Lambda(Of Func(Of Editor, Object(), PromptStatus))(Expression.Call(instance, method, args), instance, args).Compile()
  22.    End Function
  23. End Module

 
然后,我使用构建的对象ID集合填充我的SelectionSet。以下是我用来尝试使用AutoCAD提供的内置旋转命令的代码:
 
  1. <CommandMethod("My-Rotate")> _
  2. Public Sub MyRotate()
  3.    'Get the current document and database
  4.    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  5.    Dim acCurDb As Database = acDoc.Database
  6.    Dim acObj As Object
  7.    Dim entRes As PromptEntityResult
  8.    Dim entOpts As PromptEntityOptions
  9.    Dim rb As ResultBuffer
  10.    Dim FoundHunter As Boolean
  11.    Dim acBlkTbl As BlockTable
  12.    Dim acBlkTblRec As BlockTableRecord
  13.    Dim pickedPolyline As Polyline = Nothing
  14.    Dim SelSet As SelectionSet
  15.    Dim Lst_ObjId As New List(Of ObjectId)
  16.    'Prompt user to select the conveyor he wants to rotate
  17.    Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView()
  18.    entOpts = New PromptEntityOptions(vbLf & "Choose the object you wish to rotate")
  19.    entRes = acDoc.Editor.GetEntity(entOpts)
  20.    If (entRes.Status = PromptStatus.OK) Then
  21.        'Start a transaction
  22.        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  23.            acObj = entRes.ObjectId.GetObject(OpenMode.ForRead)
  24.            'Make sure the selected object was a polyline
  25.            If Not TypeOf acObj Is Polyline Then MsgBox("You must choose a line or polyline") : Exit Sub
  26.            rb = New ResultBuffer
  27.            rb = entRes.ObjectId.GetObject(OpenMode.ForRead).XData()
  28.            'Sets the correct Project Conveyor
  29.            ProjectConveyor.SetByDataTable(GetPKFromResultBuffer(rb), Project.PK_Project)
  30.            
  31.            'Open the Block table for read
  32.            acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)            
  33.          
  34.            'Open the Block table record Model space for write
  35.            acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  36.            'Go through the Block Table Record and build the collection ID
  37.            For Each acObjId As ObjectId In acBlkTblRec
  38.                rb = New ResultBuffer
  39.                rb = acObjId.GetObject(OpenMode.ForRead).XData()
  40.                FoundHunter = False
  41.                If Not rb Is Nothing Then
  42.                    For Each tv As TypedValue In rb
  43.                        If tv.TypeCode = DxfCode.ExtendedDataRegAppName Then
  44.                            If tv.Value = "MY_PROGRAM_NAME" Then FoundHunter = True
  45.                        End If
  46.                        If FoundHunter And tv.TypeCode = DxfCode.ExtendedDataInteger32 Then
  47.                            If tv.Value = ProjectConveyor.PK_ProjectConveyor Then
  48.                                Lst_ObjId.Add(acObjId) 'Sets up all object IDs correctly here
  49.                                Exit For
  50.                            End If
  51.                        End If
  52.                    Next
  53.                    rb.Dispose()
  54.                End If
  55.            Next
  56.            'Create a selection set from object IDs
  57.            SelSet = SelectionSet.FromObjectIds(Lst_ObjId.ToArray)
  58.            'Use AUTOCAD's Rotate function knowing we have all selections in selection set
  59.            acDoc.Editor.Command("_.rotate", SelSet, "")
  60.            'Save the new objects to the database
  61.            ProjectConveyor.Update()
  62.            acTrans.Commit()
  63.        End Using
  64.    End If
  65. End Sub

 
我的问题是,每当我到达acDoc。编辑命令()部分,它不会提示用户旋转任何内容。它返回错误(-5001)。。。有什么想法吗?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:21:15 | 显示全部楼层
 
尝试移动编辑器。Command()从事务的using语句中调用,在它后面加上类似(如图所示)的内容:
 
  1.                    // ...
  2.                    //Create a selection set from object IDs
  3.                    SelSet = SelectionSet.FromObjectIds(Lst_ObjId.ToArray());
  4.                    //Use AUTOCAD's Rotate function knowing we have all selections in selection set
  5.                    //acDoc.Editor.Command("_.rotate", SelSet, "");
  6.                    //Save the new objects to the database
  7.                    ProjectConveyor.Update();
  8.                    acTrans.Commit();
  9.                }
  10.                [color="red"]if (SelSet.Count > 0)
  11.                    acDoc.Editor.Command("_.rotate", SelSet, "");[/color]
  12.            }
  13.        }

 
^^2015年测试,FWIW
回复

使用道具 举报

2

主题

13

帖子

11

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:29:19 | 显示全部楼层
感谢黑盒回复。
 
我找到了问题的根源,但还没有解决。
 
我在AutoCad标准版中测试了这一切,这是所有用户通常使用的版本。

                               
登录/注册后可看大图

 
最后,我在AutoCad Mechanical edition中进行了测试。

                               
登录/注册后可看大图

 
它只在机械方面起作用。在Mechanical中,它甚至可以与事务中的编辑器命令一起工作。为了慎重起见,我将按照你的建议把它排除在交易之外。
 
你知道为什么它在标准版中如此浮夸吗?
 
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:36:47 | 显示全部楼层
 
没有更多信息或完整的代码继续。。。不
 
我也在使用AutoCAD垂直工具,如Map 3D和Civil 3D(我们的主要生产工具)。。。Map 3D、Civil 3D、Mechanical、MEP等垂直视图构建在我们称之为vanilla AutoCAD(您称之为标准)的基础上,因此在AutoCAD中工作的内容将在垂直视图(OOTB)中工作。。。然而,在垂直方向上起作用的可能在香草中不一定起作用。
 
如果您发现需要两个独立的交互,那么您可以考虑在代码中使用and If或SWITCH case语句有条件地测试它,或者只编译两个独立的程序集,并使用自动加载机制将正确的程序集自动加载到正确的应用程序中。如果还不熟悉,请参阅我签名中的链接以了解更多信息。
 
另外,如果你还不是ADN会员,你将继续为你的雇主开发内部定制。。。您可以考虑成为AUGI Professional会员,该会员具有免费的Autodesk Developer Network(ADN)标准会员资格(为您节省1400美元)。
 
干杯
回复

使用道具 举报

2

主题

13

帖子

11

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:40:48 | 显示全部楼层
你说得对,我在“标准”AutoCAD上使用了Vanilla配置文件,而机械配置文件从ACADMPP开始。
 
我会在你的签名中查看你的自动加载器链接。此外,我将登记成为AUGI专业会员。看起来很有趣。
 
谢谢
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:55:22 | 显示全部楼层
 
不客气,Alex_AMF;我很乐意帮忙。
 
干杯
回复

使用道具 举报

2

主题

13

帖子

11

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:59:23 | 显示全部楼层
最后一个问题。。。
 
我对使用内置rotate命令的代码有一个问题。旋转项目后,我想在数据库中保存新的Point3d,然后保存图形。尽管如此,我的问题是编译器要通过编辑器。Command(),一直持续到结束子对象,然后提示用户旋转对象。
 
为什么不等到用户完成命令后再继续?它只是直接通过。
 
有办法解决这个问题吗?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 23:11:09 | 显示全部楼层
 
您应该仔细阅读同步执行和异步执行之间的区别。
 
您可能需要考虑使用SendStringToExecute()。
 
干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 11:38 , Processed in 0.745796 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表