VB.net进行CAD二次开发(二)与cad交互
开发过程遇到了一个问题:自制窗口与控件与CAD的交互。
启动类,调用非模式窗口
Imports Autodesk.AutoCAD.Runtime
Public Class Class1
'//CAD启动界面
<CommandMethod("US")>
Public Sub UiStart()
Dim myfrom As Form1 = New Form1()
'Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(myfrom); // 模态显示
'; // 非模态显示
Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(myfrom)
End Sub
End Class
非模式窗体
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports System.Windows.Forms
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports System.Runtime.InteropServices
Imports Application = Autodesk.AutoCAD.ApplicationServices.Application
Public Class Form1
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Public Property MyDoc() As Document
Get
Return doc
End Get
Set(ByVal value As Document)
doc = value
End Set
End Property
'调用windows all的命令,两种方法都可以
' <DllImport("user32.DLL")> _
' Public Shared Function SetFocus(ByVal hWnd As IntPtr) As Integer
'End Function
Public Declare Function SetFocus Lib "USER32.DLL" (ByVal hWnd As Integer) As Integer
Public Sub New()
InitializeComponent()
SetFocus(doc.Window.Handle)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ed.WriteMessage("欢迎使用批量统计线段长度小工具,请框选线段!\n")
'在界面开发中,操作图元时,首先进行文档锁定 ,利用using 语句变量作用范围,结束时自动解锁文档
Using docLock As DocumentLock = doc.LockDocument()
'过滤删选条件设置 过滤器
Dim typedValues(0) As TypedValue
typedValues.SetValue(New TypedValue(0, "*LINE"), 0)
Dim sSet As SelectionSet = SelectSsGet("GetSelection", Nothing, typedValues)
Dim sumLen As Double = 0
' 判断是否选取了对象
If sSet IsNot Nothing Then
'遍历选择集
For Each sSObj As SelectedObject In sSet
' 确认返回的是合法的SelectedObject对象
If sSObj IsNot Nothing Then
'开启事务处理
Using trans As Transaction = db.TransactionManager.StartTransaction()
Dim curEnt As Curve = trans.GetObject(sSObj.ObjectId, OpenMode.ForRead)
' 调整文字位置点和对齐点
Dim endPoint As Point3d = curEnt.EndPoint
'GetDisAtPoint 用于返回起点到终点的长度 传入终点坐标
Dim lineLength As Double = curEnt.GetDistAtPoint(endPoint)
ed.WriteMessage("\n" + lineLength.ToString())
sumLen = sumLen + lineLength
trans.Commit()
End Using
End If
Next
End If 'using 语句 结束,括号内所有对象自动销毁,不需要手动dispose()去销毁
ed.WriteMessage("\n 线段总长为: " & (sumLen.ToString()))
End Using
End Sub
Public Function SelectSsGet(ByVal selectStr As String, ByVal point3dCollection As Point3dCollection, ByVal typedValue() As TypedValue) As SelectionSet
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
'将过滤条件赋值给SelectionFilter对象
Dim selfilter As SelectionFilter = Nothing
If typedValue IsNot Nothing Then
selfilter = New SelectionFilter(typedValue)
End If
' 请求在图形区域选择对象
Dim psr As PromptSelectionResult
If selectStr = "GetSelection" Then '提示用户从图形文件中选取对象
psr = ed.GetSelection(selfilter)
ElseIf (selectStr = "SelectAll") Then '选择当前空间内所有未锁定及未冻结的对象
psr = ed.SelectAll(selfilter)
ElseIf selectStr = "SelectCrossingPolygon" Then '选择由给定点定义的多边形内的所有对象以及与多边形相交的对象。多边形可以是任意形状,但不能与自己交叉或接触。
psr = ed.SelectCrossingPolygon(point3dCollection, selfilter)
'选择与选择围栏相交的所有对象。围栏选择与多边形选择类似,所不同的是围栏不是封闭的, 围栏同样不能与自己相交
ElseIf selectStr = "SelectFence" Then
psr = ed.SelectFence(point3dCollection, selfilter)
'选择完全框入由点定义的多边形内的对象。多边形可以是任意形状,但不能与自己交叉或接触
ElseIf selectStr = "SelectWindowPolygon" Then
psr = ed.SelectWindowPolygon(point3dCollection, selfilter)
ElseIf selectStr = "SelectCrossingWindow" Then '选择由两个点定义的窗口内的对象以及与窗口相交的对象
Dim point1 As Point3d = point3dCollection(0)
Dim point2 As Point3d = point3dCollection(1)
psr = ed.SelectCrossingWindow(point1, point2, selfilter)
ElseIf selectStr = "SelectWindow" Then '选择完全框入由两个点定义的矩形内的所有对象。
Dim point1 As Point3d = point3dCollection(0)
Dim point2 As Point3d = point3dCollection(1)
psr = ed.SelectCrossingWindow(point1, point2, selfilter)
Else
Return Nothing
End If
'// 如果提示状态OK,表示对象已选
If psr.Status = PromptStatus.OK Then
Dim sSet As SelectionSet = psr.Value
ed.WriteMessage("Number of objects selected: " + sSet.Count.ToString() + "\n") '打印选择对象数量
Return sSet
Else
' 打印选择对象数量
ed.WriteMessage("Number of objects selected 0 \n")
Return Nothing
End If
End Function
End Class
参考文献
https://zhuanlan.zhihu.com/p/138579148
VB.NET自动操作其他程序(2)--声明DLL相关函数 - zs李四 - 博客园
相关文章:
VB.net进行CAD二次开发(二)与cad交互
开发过程遇到了一个问题:自制窗口与控件与CAD的交互。 启动类,调用非模式窗口 Imports Autodesk.AutoCAD.Runtime Public Class Class1 //CAD启动界面 <CommandMethod("US")> Public Sub UiStart() Dim myfrom As Form1 New…...
【NLP 11、Adam优化器】
祝你先于春天, 翻过此间铮铮山峦 —— 24.12.8 一、Adam优化器的基本概念 定义 Adam(Adaptive Moment Estimation)是一种基于梯度的优化算法,用于更新神经网络等机器学习模型中的参数。它结合了动量法(Momentum&…...
51单片机应用开发(进阶)---串口接收字符命令
实现目标 1、巩固UART知识; 2、掌握串口接收字符数据; 3、具体实现目标:(1)上位机串口助手发送多字符命令,单片机接收命令作相应的处理(如:openled1 即打开LED1;closeled1 即关…...
redis 怎么样删除list
在 Redis 中,可以使用以下方法删除列表或列表中的元素: 1. 删除整个列表 使用 DEL 命令删除一个列表键: DEL mylist这个命令会删除键 mylist 及其值(无论 mylist 是一个列表还是其他类型的键)。 2. 删除列表中的部分…...
【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现快速排序算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 10 6 8 7 9 0 1 3 2 4 5 (说明:第一行是元素个数&a…...
npm或yarn包配置地址源
三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装:yarn install 注意…...
STUN服务器用于内网NAT的方案
在内网中部署 STUN 服务器的场景通常用于处理多层 NAT 或内网客户端之间的通信需求,尤其是在大企业或学校等复杂网络环境下。通过 STUN 服务器,可以帮助客户端设备检测和适配 NAT 转换规则,进而支持 WebRTC 或其他实时通信技术的正常运行。 …...
Linux 简单命令总结
1. 简单命令 1.1. ls 列出该目录下的所有子目录与文件,后面还可以跟上一些选项 常用选项: ・-a 列出目录下的所有文件,包括以。开头的隐含文件。 ・-d 将目录象文件一样显示,而不是显示其下的文件。如:ls -d 指定目…...
Vue.js组件开发:提升你的前端工程能力
Vue.js 是一个用于构建用户界面的渐进式框架,它允许开发者通过组件化的方式创建可复用且易于管理的代码。在 Vue.js 中开发组件是一个直观且高效的过程,下面我将概述如何创建和使用 Vue 组件,并提供一些最佳实践。 1. 创建基本组件 首先&am…...
使用 Pandas 读取 JSON 数据的五种常见结构解析
文章目录 引言JSON 数据的五种常见结构1. split 结构2. records 结构3. index 结构4. columns 结构5. values 结构 引言 在日常生活中,我们经常与各种数据打交道,无论是从网上购物的订单信息到社交媒体上的动态更新。JSON(JavaScript Object…...
C++鼠标轨迹算法(鼠标轨迹模拟真人移动)
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
Go mysql驱动源码分析
文章目录 前言注册驱动连接器创建连接交互协议读写数据读数据写数据 mysqlConncontext超时控制 查询发送查询请求读取查询响应 Exec发送exec请求读取响应 预编译客户端预编译服务端预编译生成prepareStmt执行查询操作执行Exec操作 事务读取响应query响应exec响应 总结 前言 go…...
GNSS误差源及差分定位
GNSS误差源: (一)卫星星历误差 由星历信息所得出的卫星位置坐标与实际位置坐标的偏差就是星历误差。星历信息是由 GPS 地面部分测量计算后传入空间部分的。由于卫星在运动中要受到各种摄动力的作用, 而地面部分又很难精确测量这些作用力,…...
pg数据类型
1、数值类型: smallint 2 字节 小范围整数 -32768 到 32767 integer 4 字节 常用的整数 -2147483648 到 2147483647 bigint 8 字节 大范围整数 -9223372036854775808 到 9223372036854775807 decimal 可变长 用户指定的精度&#x…...
【java】finalize方法
目录 1. 说明2. 调用过程3. 注意事项 1. 说明 1.finalize方法是Java中Object类的一个方法。2.finalize方法用于在对象被垃圾回收之前执行一些清理工作。3.当JVM(Java虚拟机)确定一个对象不再被引用、即将被回收时,会调用该对象的finalize方法…...
HNU_多传感器(专选)_作业4(构建单层感知器实现分类)
1. (论述题)(共1题,100分) 假设平面坐标系上有四个点,要求构建单层感知器实现分类。 (3,3),(4,3) 两个点的标签为1; (1,1),(0,2) 两个点的标签为-1。 思路:要分类的数据是2维数据,需要2个输入…...
以太网链路详情
文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…...
vue3 setup语法,子组件点击一个元素打印了这个元素的下标id,怎么传递给父组件,让父组件去使用
问: vue3 setup语法,子组件点击一个元素打印了这个元素的下标id,怎么传递给父组件,让父组件去使用 回答: 在 Vue 3 中,你可以使用 setup 语法糖和组合式 API 来实现子组件向父组件传递数据。具体来说&am…...
《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》
《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束,训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…...
【.net core】【sqlsugar】大数据写入配置(需要版本5.0.45)
官网连接 https://www.donet5.com/home/Doc?typeId2404 泛型方法 /// <summary> /// 大数据写入(泛型方法) /// </summary> /// <param name"entitys"></param> /// <returns></returns> ///代码中_d…...
告别Appium!用Python+uiautomator2搞定Android自动化测试(保姆级环境搭建指南)
告别Appium!用Pythonuiautomator2搞定Android自动化测试(保姆级环境搭建指南) 如果你正在为Appium的复杂配置、缓慢执行速度而头疼,或者厌倦了那些莫名其妙的连接问题,那么是时候尝试更轻量高效的解决方案了。uiautoma…...
如何利用The Incredible PyTorch离线文档:深度学习者的终极学习宝典
如何利用The Incredible PyTorch离线文档:深度学习者的终极学习宝典 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitcode.…...
Aura包管理器与Faur元数据服务器:了解Arch Linux包管理的终极解决方案
Aura包管理器与Faur元数据服务器:了解Arch Linux包管理的终极解决方案 【免费下载链接】aura A multilingual package manager for Arch Linux and the AUR. 项目地址: https://gitcode.com/gh_mirrors/aur/aura Aura是一个多语言包管理器,专为Ar…...
初创团队如何利用Token Plan套餐控制大模型API开发成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何利用Token Plan套餐控制大模型API开发成本 对于初创团队而言,在原型开发和产品迭代阶段,技术选…...
Godot行为树框架实战:构建模块化、可复用的游戏AI系统
1. 项目概述:为你的Godot游戏注入灵魂的AI框架 在游戏开发中,给NPC(非玩家角色)赋予“灵魂”一直是个既迷人又头疼的挑战。你肯定不想让敌人像木桩一样站着,或者只会沿着固定路线来回踱步,对吧?…...
黑莓BB10失败启示录:操作系统生态竞争与品牌转型的经典案例
1. 项目概述:一场关于键盘的“信仰崩塌”作为一名在消费电子和移动通信领域摸爬滚打了十几年的从业者,我见过太多产品的起起落落。但2012年5月1日,在奥兰多黑莓世界大会上发生的那一幕,至今回想起来,依然能让我清晰地感…...
在Android 9上用vsomeip 3.3.8实现跨进程通信:一份保姆级编译与配置指南
在Android 9上实现跨进程通信:vsomeip 3.3.8编译与配置实战 在车载以太网和智能座舱系统开发中,跨进程通信(IPC)是基础且关键的技术环节。对于Android平台开发者而言,如何在NDK环境下高效实现Linux进程间通信ÿ…...
从STM32F103到RP2040:新手如何用Arduino快速上手这块‘网红’双核MCU(附Wokwi在线仿真链接)
从STM32F103到RP2040:用Arduino生态快速征服双核MCU 第一次拿到RP2040开发板时,我习惯性地翻出STM32的工程模板准备移植——直到发现这个拇指大小的板子藏着两个能跑到133MHz的Arm Cortex-M0核心。作为从STM32F103时代走过来的开发者,我们早…...
【Twitter算法适配型Prompt库】:2024Q2官方推荐权重结构解析+ChatGPT生成内容通过率提升67%的12个黄金句式
更多请点击: https://intelliparadigm.com 第一章:Twitter算法适配型Prompt库的演进逻辑与2024Q2权重变革本质 算法信号层重构驱动Prompt范式迁移 2024年第二季度,X(原Twitter)平台正式将Engagement Velocity Ratio&…...
从‘一片蓝’到‘五彩斑斓’:手把手教你美化Matlab三维柱状图,让论文图表脱颖而出
从‘一片蓝’到‘五彩斑斓’:科研级Matlab三维柱状图视觉优化全攻略 当审稿人翻开一篇论文时,图表往往是他们最先注意到的元素。我曾参与过多次学术期刊的评审工作,那些配色考究、细节精致的图表总能在第一时间抓住眼球——这不仅仅是审美问题…...
