首页 > 其他分享 >VBNET AUTOCAD 单行文字OBB有向包围盒的计算

VBNET AUTOCAD 单行文字OBB有向包围盒的计算

时间:2023-09-28 09:03:13浏览次数:48  
标签:Dim AUTOCAD OBB obbPoly 包围 New bingbox VBNET Math

遇到要求单行文字包围和的需求,发现AutoCAD自带的算法仅能求出正交包围盒,如下图所示的粉色矩形

我想获取下图下图所示蓝色矩形的部分及OBB

计算方法图形示例:

下面是完整的代码,其中求D点的坐标p1涉及到向量定比分点公式

<CommandMethod(NameOf(TT_SingleTextOBB))>
    Sub TT_SingleTextOBB()
        Dim acDoc = Application.DocumentManager.MdiActiveDocument
        Dim acDb = Application.DocumentManager.MdiActiveDocument.Database
        Dim acEd = Application.DocumentManager.MdiActiveDocument.Editor
        Dim pso As New Autodesk.AutoCAD.EditorInput.PromptSelectionOptions With
            {
            .RejectObjectsOnLockedLayers = True,
            .MessageForAdding = "选择单行文字", .SelectEverythingInAperture = False
            }
        Dim pv As New TypedValue(DxfCode.Start, "Text")
        Dim psr = acEd.GetSelection(pso, New SelectionFilter({pv}))
        Try
            If psr.Status = PromptStatus.OK Then
                Using tr As Transaction = acDb.TransactionManager.StartTransaction()
                    Dim bt As BlockTable = tr.GetObject(acDb.BlockTableId, OpenMode.ForRead)
                    Dim ms As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
                    For Each item As SelectedObject In psr.Value
                        Try
                            '获取文字正交的包围盒
                            Dim t As DBText = tr.GetObject(item.ObjectId, OpenMode.ForRead)
                            Dim bingbox = t.GeometricExtents
                            Dim width = bingbox.MaxPoint.X - bingbox.MinPoint.X
                            Dim height = bingbox.MaxPoint.Y - bingbox.MinPoint.Y
                            Dim pa As New Point2d(0.5 * (bingbox.MaxPoint.X + bingbox.MinPoint.X), 0.5 * (bingbox.MaxPoint.Y + bingbox.MinPoint.Y)) '正交包围的形心
                            Dim pb = New Point2d(bingbox.MinPoint.X, bingbox.MinPoint.Y) '正交包围的左下角
                            Dim α = t.Rotation, tol = 0.000001
                            Dim pc = pb.Add(New Vector2d(width, 0)) '正交包围的右下角
                            Dim vpab = pa.GetVectorTo(pb) '向量AB
                            Dim vpac = pa.GetVectorTo(pc) '向量AC
                            Dim vpad As New Vector2d(vpab.X, vpab.Y) '向量AD
                            Dim x = width, y = height 'OBB包围盒的宽度和高度
                            If Math.Abs(Math.Sin(α)) > tol And Math.Abs(Math.Cos(α)) > tol Then '排除正交包围盒本身就是OBB包围盒的情况
                                'Dim k1 = (Math.Cos(α) - Math.Sin(α)) / (Math.Tan(α) - 1.0 / Math.Tan(α))
                                x = (width / Math.Sin(α) - height / Math.Cos(α)) / (1.0 / Math.Tan(α) - Math.Tan(α))
                                y = (width / Math.Cos(α) - height / Math.Sin(α)) / (Math.Tan(α) - 1.0 / Math.Tan(α))
                                'acEd.WriteMessage($"{x},{y}" + Environment.NewLine)
                                '向量定比分点公式求出向量AD
                                vpad = (vpab * x * Math.Cos(α) + vpac * y * Math.Sin(α)) / width
                            End If
                            Dim p1 = pa.Add(vpad)
                            Dim ang1 = 2 * Math.Atan(x / y) '求出第OBB包围盒左下角点到右下角点的旋转角
                            Dim p2 = p1.RotateBy(ang1, pa)
                            Dim p3 = p1.RotateBy(Math.PI, pa)
                            Dim p4 = p2.RotateBy(Math.PI, pa)
                            Dim obbPoly As New Polyline
                            obbPoly.AddVertexAt(0, p1, 0, 0, 0)
                            obbPoly.AddVertexAt(1, p2, 0, 0, 0)
                            obbPoly.AddVertexAt(2, p3, 0, 0, 0)
                            obbPoly.AddVertexAt(3, p4, 0, 0, 0)
                            obbPoly.AddVertexAt(4, p1, 0, 0, 0)
                            Dim oid = ms.AppendEntity(obbPoly)
                            tr.AddNewlyCreatedDBObject(obbPoly, True)
                        Catch ex As System.Exception
                            Application.ShowAlertDialog(ex.StackTrace)
                            Continue For
                        End Try
                    Next
                    tr.Commit()
                End Using
            End If
        Catch ex As System.Exception
            Application.ShowAlertDialog(ex.StackTrace)
        End Try
    End Sub

 

代码测试截图

标签:Dim,AUTOCAD,OBB,obbPoly,包围,New,bingbox,VBNET,Math
From: https://www.cnblogs.com/NanShengBlogs/p/17734808.html

相关文章

  • C# AutoCAD 利用Editor.CommandAsync 同步监测自带命令的执行情况
    #1官方文档并无相关解释:AutoCAD2023DeveloperandObjectARXHelp|Editor.CommandAsyncMethod|Autodesk#2上例子,我用自带的命令画一个圆,画完后我要修改它的颜色,此时该如何操作呢,下面是可用的代码[CommandMethod(nameof(tt_CommandAsync))]publicvoidtt_Comma......
  • AutoCAD Electrical下载-AutoCAD Electrical下载 各版本下载
    软件支持中文,增加了很多新功能,帮助用户轻松设计图纸,大大提高效率,节省工作时间,autocadelectrical是一款专业的电气控制软件,除了具有autocad的全部功能之外,还具有创建原理图,导线编号,生成物料清单等适用于电气制图的功能。具有实时错误检查功能,使电气设计团队与机械设计团队能够通过使......
  • Autocad Electrical 2020中文电气版64位下载 各个版本下载
    AutoCADElectrical2020官方版功能进行了全面升级和优化,比如增加了新的深色主题,可以让你的注意力更集中;增加了新的“经设计展开”图标;用户界面现在经过了优化,现在可以支持高分辨率显示器;而在已发布的PDF文档中,交互参考中现在提供了超链接等等,能够更好的为用户提供服务。软件地址:看......
  • HDU 2955 Robberies
    01背包银行总钱数==容量V概率可以算安全的概率p=1-p;#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;doublepp,p[10001],f[10001];intv[10001];intmain(){ intt; scanf("%d",&t); while(t--){ intn,j,i,k,sum......
  • AutoCAD Electrical下载-AutoCAD Electrical中文版下载 功能介绍
    AutoCADElectrical2020是一款面向电气设计师们使用的cad软件,在CAD原有的基础上添加了创建原理图,导线编号,生成物料清单等用于自动完成电气控制工程设计任务的工具,是电气行业用户专用的cad软件型号。软件地址:看置顶贴AutoCADElectrical2013中文安装教程:1、AutoCADElectrical20......
  • Autocad Electrical 2020中文电气版64位下载 新功能介绍
    本文为电气控制设计师准备了2022版AutoCADElectrical,此软件延续了AutoCAD一贯的用户界面,上手非常容易,可以有效提升电气设计效率。这一版本的软件优化了功能按钮和布局,而且还可以将标题栏位置和对正属性保留到非活动图形中。软件地址:看置顶贴性能引见1、提升出产效力工程师在开启电......
  • 制图软件AutoCAD 2024 win+Mac(支持M芯片的CAD)
    AutoCAD2024是Autodesk公司开发的一款专业制图软件,它具有强大的2D和3D设计和制图功能,被广泛应用于机械、建筑、土木工程、电子等领域的设计和制图工作。→→↓↓载AutoCAD2024win/Mac 首先,AutoCAD2024拥有先进的绘图工具和自动化功能。它提供了多种绘图模式和命令,如线、......
  • 批量安装Linux系统之Cobbler构建
    一、cobbler简介cobbler是一款自动化操作系统安装的实现,与PXE安装系统的区别是可以同时部署多个版本的系统,而PXE只能选择一种系统。二、安装cobbler安装yum源yuminstallepel-release-yyuminstalldhcptftp-serverxinetdhttpdcobblercobbler-webpykickstartdebmirror-y......
  • [LeetCode][198]house-robber
    ContentYouareaprofessionalrobberplanningtorobhousesalongastreet.Eachhousehasacertainamountofmoneystashed,theonlyconstraintstoppingyoufromrobbingeachofthemisthatadjacenthouseshavesecuritysystemsconnectedanditwilla......
  • Autocad2014下载安装-Autocad2014功能介绍
    Autocad2014注册机是一款专为Autocad2014设计软件提供注册的辅助软件。用户使用Autocad2014zcj可以将未经注册激活的Autocad2014软件成功注册并激活。这款软件操作简单,易于使用,拥有广泛的受众群体,如建筑师、工程师和建筑专业人员等,借助它,可以准确地和客户共享设计数据,体验本地DWG......