SolidWorks二次开发系列入门100篇之97-极点坐标

news2024/12/23 8:57:45

在这里插入图片描述
什么是极点

一个模型中的极点是指在某个方向上的最高或最低点。在三维模型中,通常有三个方向:x轴、y轴和z轴。因此,在x轴,y轴和z轴的正方向和负方向上,每个模型可能都有两个极点。极点通常是一些锐角或骨刺,可能需要特殊的注意和处理,以确保模型在渲染和动画过程中能够正确地呈现并不出现异常。

这是CSDN的AI回答的,意思应该没错吧,错了找它,别找我。在这里插入图片描述
直接一点就是某个指定方向向量上最远的一个点。

比如下面这个零件,是个斜的,别问我是谁画的在这里插入图片描述

在这里插入图片描述
这个情况下,我们要知道沿这个小圆柱上两个极点的坐标的距离 就是这个方向上的长度。
我猜这就是常规的用于包围盒可能用到的方法。
具体官方说明,请查看这个链接:
GetExtremePoint

但这个是针对某个实体的,所以在获取零件的一些极点时需要遍历实体,再获取每个实体的。
在这里插入图片描述
关键代码就这样了,复杂的我也不会。

		/// <summary>
        /// 极点坐标的获取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnExtremePoint_Click(object sender, EventArgs e)
        {
            SldWorks swApp = Utility.ConnectToSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            Vector3d vector = new Vector3d(new Point3d(0,0,0),new Point3d(1,1,1)).Normalized;

            //这里是针对零件。
            if (swModel != null &&swModel.GetType()==(int)swDocumentTypes_e.swDocPART)
            {

                PartDoc part = (PartDoc)swModel;
                var vBodies = GetBodyCopies(part);

                for (int i = 0; i < vBodies.Length; i++)
                {

                    var body = vBodies[i];

                  

                    bool ExtPRes=  body.GetExtremePoint(vector.X,vector.Y,vector.Z,out double OutX,out double OutY,out double OutZ);

                    if (ExtPRes)
                    {

                        MessageBox.Show($@"{vector.X},{vector.Y},{vector.Z}->{OutX},{OutY},{OutZ}");

                    }
                    else
                    {
                        MessageBox.Show("未找到极点");
                    }
                 



                }

            }

            //如果是装配体。

            if (swModel != null && swModel.GetType() == (int)swDocumentTypes_e.swDocASSEMBLY)
            {

                var vcomps = (object[])(swModel as AssemblyDoc).GetComponents(false);
                foreach ( var comp in vcomps)
                {
                    var tempComp=comp as Component2;

                    if (tempComp == null) continue;

                    if (tempComp.GetPathName().ToString().ToLower().EndsWith("sldprt"))
                    {

                        //把装配中的向量先转到该Comp中
                        var swMathUtility = swApp.IGetMathUtility();
                        var tempTrans = tempComp.Transform2.IInverse();
                        var tempPointInASM1 = new double[3] { 0, 0, 0 };
                        var tempPointInASM2 = new double[3] { vector.X, vector.Y, vector.Z };


                        var mathPointASM1 = (MathPoint)swMathUtility.CreatePoint(tempPointInASM1);
                        var mathPointASM2 = (MathPoint)swMathUtility.CreatePoint(tempPointInASM2);

                        var swMathPtInPart1 = (MathPoint)mathPointASM1.MultiplyTransform(tempTrans);
                        var swMathPtInPart2 = (MathPoint)mathPointASM2.MultiplyTransform(tempTrans);

                        var PointArrayData1 = (double[])swMathPtInPart1.ArrayData;
                        var PointArrayData2 = (double[])swMathPtInPart2.ArrayData;

                        //向量在该Component中
                        Vector3d vectorInPart = new Vector3d(new Point3d(PointArrayData1),new Point3d(PointArrayData2)).Normalized;


                        PartDoc part = (PartDoc)tempComp.IGetModelDoc();
                        if (part != null) {

                            var vBodies = GetBodyCopies(part);

                            for (int i = 0; i < vBodies.Length; i++)
                            {

                                var body = vBodies[i];
                                               

                                bool ExtPRes = body.GetExtremePoint(vectorInPart.X, vectorInPart.Y, vectorInPart.Z, out double OutX, out double OutY, out double OutZ);

                                if (ExtPRes)
                                {
                                    MessageBox.Show($@"零件{tempComp.Name2}->方向{vectorInPart.X},{vectorInPart.Y},{vectorInPart.Z}->{OutX},{OutY},{OutZ}(零件中的坐标)");

                                    //再转换到装配体中。
                                   
                                    var tempPointInPart = new double[3] { OutX, OutY, OutZ };

                                    var mathPoint= (MathPoint)swMathUtility.CreatePoint(tempPointInPart);

                                    var swMathPtInAsm = (MathPoint)mathPoint.MultiplyTransform(tempComp.Transform2);
                                    
                                    var arrayData = (double[])swMathPtInAsm.ArrayData;


                                    MessageBox.Show($@"零件{tempComp.Name2}->方向{vector.X},{vector.Y},{vector.Z}->{arrayData[0]},{arrayData[1]},{arrayData[2]}(装配体)");


                                }
                                else
                                {
                                    MessageBox.Show("未找到极点");
                                }



                            }

                        }

                    }




                }


            }




        }

这就是结果,要注意的是这个点不一定是你想要的中心点或者什么点,但它一定是这个方向上的极点之一。(因为这边是一个平面)
在这里插入图片描述

所以如果我们读取反方向的,圆顶那边,基本上就是唯一的了。只有最顶部。
接近于0,0,0

在这里插入图片描述

在这里插入图片描述

说明功能正常,这个办法还有助于标总长总宽这种类型的,在工程图中可能需要做辅助点,具体的我就不再解释了
本系列课程源码 https://gitee.com/painezeng/CSharpAndSolidWorks

希望大家点赞收藏,还有什么来的。。。
在这里插入图片描述

对,给钱。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/828710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界zorropub题解与subprocess模块

目录 题目分析&#xff1a; subprocess模块&#xff1a; subprocess.Popen()函数&#xff1a; subprocess.run()函数&#xff1a; 题目脚本&#xff1a; 在攻防世界做到一个题目感觉还挺有意思&#xff0c;记录一下 这个放链接也只是攻防世界的页面&#xff0c;所以直接说…

docker数据持久化

在Docker中若要想实现容器数据的持久化&#xff08;所谓的数据持久化即数据不随着Container的结束而销毁&#xff09;&#xff0c;需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 &#xff08;1&#xff09;Volumes&#xff1a;…

【C#学习笔记】值类型(1)

虽然拥有编程基础的人可以很快地上手C#&#xff0c;但是依然需要学习C#的特性和基础。本系列是本人学习C#的笔记&#xff0c;完全按照微软官方文档编写&#xff0c;但是不适合没有编程基础的人。 文章目录 .NET 体系结构Hello&#xff0c;World类型和变量&#xff08;重要&…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)

本篇主要说明&#xff1a; 1. 因为这个mysql版本是8.0&#xff0c;所以当其中一台mysql节点挂掉之后&#xff0c;主从同步&#xff0c;甚至双向数据同步都失效了&#xff0c;所以本篇主要记录下当其中的节点挂掉之后如何再次生效。另外推荐大家使用mysql5.7的版本&#xff0c;这…

3-ASCII-座位渲染-二维码

一 ASCII码 1 概念 ascii码是一种计算机信息交换标准,在这个表里面制定了 128个数字跟128个字符的对应关系 我们只关注字母跟数字的对应关系 2 ASCII码转字符 let str String.fromCharCode(数字)二 js对象跟查询字符串互转 a js对象转查询字符串 //创建一个对象 let obj …

新SDK平台下载开源全志D1-H/D1s的SDK

获取SDK SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is…

【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

目录 前言 安装 pip安装 安装包安装 柱状图 主要方法 参数说明 示例代码 效果图 解决中文显示问题 修改后的图片 饼状图 主要方法 示例代码 效果图 动态图 主要方法 动态图官方使用介绍 示例代码 颜色设置 内建颜色 字体设置 资料获取方法 前言 众所周…

WPF上位机6——文件操作、多线程、线程锁、Task异步编程

文件操作 文件夹操作 创建文件夹 磁盘信息 文件的读写 文件流 Thread多线程 带参数创建线程 Task多线程 创建方式1 第一种 第二种 第三种&#xff1a;线程池的方式 前台与后台线程 线程锁 Task异步编程 task任务取消 task返回值 async await异步 并行库Parallel

CEC2014:CEC2014测试函数及多种智能优化算法求解CEC2014对比

目录 一、CEC2014测试函数 二、多种智能优化算法求解CEC2014 2.1 本文参与求解CEC2014的智能优化算法 2.2 部分测试函数运行结果与收敛曲线 三、曲线标记代码(获得代码后可自行更改&#xff09; 一、CEC2014测试函数 CEC2014测试集共有30个单目标测试函数&#xff0…

linux下docker安装、镜像下载、镜像基础操作、容器基础操作

目录 一、环境准备 1、开启虚拟化 2、关闭防火墙 3、yum仓库获取阿里源&#xff08;清华、京东都可以&#xff09; 4、确保能ping到外网 二、安装docker 1、yum安装docker 2、启动docker并设置开机自启 3、安装docker-ce阿里镜像加速器 三、docker基本操作 1、查看版…

如何在项目需求与技术方案未确定的情况下掌控上线时间?

需求不明确与技术方案未确定的挑战 在任何项目管理过程中&#xff0c;需求和技术方案是两个核心环节。理想情况下&#xff0c;我们希望在项目开始阶段就有清晰明确的需求和经过深思熟虑的技术方案。然而&#xff0c;现实中的项目管理往往并不如此理想。 项目需求的重要性 需求…

2023年全新版Java学习路线,精心整理【文中送书福利 】

小伙伴们大家好&#xff0c;这里是动力节点&#xff0c;我们从2009年开始一直在从事Java培训 到今年已经整14年了&#xff0c;虽然现在不缺培训机构&#xff0c;更不缺Java培训&#xff0c;但是像我们这么多年专注这一件事的应该也不多。我们只希望在“专业”两个字上面不断精…

Vue3 基础知识点汇总 自学笔记,记录难点 和 新知识点

1.vue3 基础 1.1vue3基础及创建 npm init vue@latest1.2.熟悉项目目录及关键文字 1.3 组合式API-setup 1.4.组合式 API reactive 和ref 函数 (都是为了生成响应式数据) 1.5.组合式API-computed 计算属性函数 1.6.watch 函数 1.7.组合式API-生命周期函数 1.8.组合式 API-父子…

Spring之事务实现方式及原理

目录 Spring事务简介 Spring支持事务管理的两种方式 编程式事务控制 声明式事务管理 Spring事务角色 未开启事务之前 开启Spring的事务管理后 事务配置 事务传播行为 事务传播行为的可选值 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功…

Python之pyinstaller打包exe填坑总结

一、起因 编写了一个提取图片中文字的python脚本&#xff0c;想传给同事使用&#xff0c;但是同事电脑上没有任何python环境&#xff0c;更没有安装python库&#xff0c;因此想到通过pyinstaller打包成exe程序传给同事使用&#xff0c;于是开始了不断地挖坑填坑之旅 import p…

Kafka-消费者组消费流程

消费者向kafka集群发送消费请求&#xff0c;消费者客户端默认每次从kafka集群拉取50M数据&#xff0c;放到缓冲队列中&#xff0c;消费者从缓冲队列中每次拉取500条数据进行消费。

Dockerfile构建SSHD镜像

Dockerfile构建SSHD镜像 基于Dockerfile制作镜像时首先需要建立工作目录&#xff0c;作为生成镜像的工作目录&#xff0c;然后分别创建并编写 Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件。 1、环境配置&#xff1a; [rootdocker ~]# iptables -F [rootdoc…

用python+PyQt5来编写一个定时关机窗口

一、界面展示 二、源码 import sys from PyQt5.QtWidgets import QDesktopWidget,QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QSpinBox import osclass AutoShutdownApp(QWidget):def __init__(self):super().__init__()self.setWindowTitle("自动关机应…

Aop监控所有Controller,包括void类型的response中的出参(工具类)

一、主要坐标 <!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifa…

saas堡垒机定义以及优势简单说明

工作中我们经常可以听到saas这个词语&#xff0c;但对于saas堡垒机相信还有很多人不了解。今天我们就来一起简单聊聊什么是saas堡垒机&#xff0c;saas堡垒机有哪些优势。 saas堡垒机定义 saas堡垒机顾名思义为一款SaaS化堡垒机产品&#xff0c;即一款SaaS运维审计安全系统。…