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…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
