【Rhino】【Python】将beam线的端点沿着自身方向移动到column轮廓线上

#coding=utf-8
import rhinoscriptsyntax as rs
import Rhino.Geometry as rgdef extend_lines_to_columns():print("开始运行脚本...")# 定义要处理的图层名称beam_layer = "Make2D::Visible::Curves::02 STR. SOLID MAMBER::1*.1.BEAM MAIN (UNIONED)"column_layers = ["03 STR. DRAFT MEMBER::COLUMN BELOW","03 STR. DRAFT MEMBER::COLUMN (BELOW AND ABOVE)"]# 检查范围(毫米)search_distance = 1000# 获取指定图层中的所有线条beam_objects = rs.ObjectsByLayer(beam_layer)print("在图层 {} 中找到 {} 个线条".format(beam_layer, len(beam_objects) if beam_objects else 0))if not beam_objects:print("未找到线条")return# 获取所有柱子对象column_objects = []for layer in column_layers:columns = rs.ObjectsByLayer(layer)if columns:for col in columns:if rs.IsCurveClosed(col):column_objects.append(col)print("在图层 {} 中找到 {} 个封闭曲线".format(layer, len(column_objects)))if not column_objects:print("未找到封闭曲线")returnmodified_count = 0# 处理每条线for beam in beam_objects:if not rs.IsLine(beam):continue# 获取线的端点start_point = rs.CurveStartPoint(beam)end_point = rs.CurveEndPoint(beam)if not start_point or not end_point:continue# 计算方向向量vector = rs.VectorCreate(end_point, start_point)vector = rs.VectorUnitize(vector)# 创建检查用的线段(在原始端点的位置延伸)start_search_point = rs.PointAdd(start_point, rs.VectorScale(vector, -search_distance))end_search_point = rs.PointAdd(end_point, rs.VectorScale(vector, search_distance))# 创建搜索线段start_search_line = rs.AddLine(start_point, start_search_point)end_search_line = rs.AddLine(end_point, end_search_point)need_update = Falsenew_start = start_pointnew_end = end_point# 检查每个柱子for column in column_objects:# 检查起点方向intersections = rs.CurveCurveIntersection(start_search_line, column)if intersections:new_start = intersections[0][1]need_update = True# 检查终点方向intersections = rs.CurveCurveIntersection(end_search_line, column)if intersections:new_end = intersections[0][1]need_update = True# 删除搜索线rs.DeleteObject(start_search_line)rs.DeleteObject(end_search_line)# 如果需要更新,创建新的线段if need_update:rs.DeleteObject(beam)new_beam = rs.AddLine(new_start, new_end)# 保持原始属性if new_beam:rs.ObjectLayer(new_beam, beam_layer)modified_count += 1print("处理完成,修改了 {} 个线条".format(modified_count))rs.Redraw()# 运行函数
if __name__ == "__main__":extend_lines_to_columns()

1. 整体流程图

处理完所有直线
开始
定义图层和搜索距离
获取beam图层中的直线
获取column图层中的封闭曲线
循环处理每条beam直线
是否为直线?
获取直线端点和方向向量
创建搜索线段
检查与柱子的相交
是否有相交点?
更新端点位置
保持原端点
创建新直线
结束

2. 关键步骤解析

2.1 初始化和数据获取
定义图层名称
设置搜索距离1000mm
获取beam图层直线
获取column图层封闭曲线
2.2 直线处理流程
获取直线端点
计算方向向量
创建搜索范围线段
检查起点方向相交
检查终点方向相交
更新端点位置
创建新直线

3. 代码关键部分解析

3.1 数据准备
# 获取beam直线
beam_objects = rs.ObjectsByLayer(beam_layer)
# 获取封闭的column曲线
column_objects = [col for col in rs.ObjectsByLayer(layer) if rs.IsCurveClosed(col)]

作用:从指定图层获取需要处理的几何对象

3.2 直线检查和处理
# 获取端点和方向
start_point = rs.CurveStartPoint(beam)
end_point = rs.CurveEndPoint(beam)
vector = rs.VectorCreate(end_point, start_point)
vector = rs.VectorUnitize(vector)  # 单位化向量

作用:获取直线的基本信息用于后续计算

3.3 搜索范围创建
# 创建搜索点
start_search_point = rs.PointAdd(start_point, rs.VectorScale(vector, -search_distance))
end_search_point = rs.PointAdd(end_point, rs.VectorScale(vector, search_distance))# 创建搜索线段
start_search_line = rs.AddLine(start_point, start_search_point)
end_search_line = rs.AddLine(end_point, end_search_point)

作用:创建用于检测相交的临时线段

3.4 相交检测
# 检查相交
intersections = rs.CurveCurveIntersection(search_line, column)
if intersections:new_point = intersections[0][1]  # 获取相交点

作用:检测搜索线段是否与柱子相交

4. 关键概念说明

  1. 搜索距离

    • 在直线端点延伸方向上下1000mm范围内搜索
    • 只在这个范围内找到的相交点才会被考虑
  2. 方向向量

    • 使用直线的两个端点确定方向
    • 向量单位化以保证搜索距离准确
  3. 相交检测

    • 使用临时搜索线段进行检测
    • 分别检查起点和终点方向
    • 找到相交点后更新端点位置
  4. 更新原则

    • 只有找到相交点时才更新端点
    • 保持原始直线的图层属性
    • 更新完成后删除原直线,创建新直线

5. 数据流向

输入图层
几何对象
端点坐标
搜索范围
相交检测
新端点
输出直线

这个代码的核心思想是:在不改变直线方向的情况下,仅当直线端点延伸方向上有柱子时,才将端点移动到相交位置,这样可以确保直线准确地连接到柱子上。

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

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

相关文章

Huggingface数据集采样之后得到的arrow文件无法用Dataset.load_from_disk加载解决方法

问题起源 我现在有数据集 我想要采样1/10构成一个新的数据集。起初我只是简单的使用save_to_disk保存,如下代码: from datasets import Dataset import os# 原数据集路径 source_dataset_path "~/.cache/huggingface/datasets/allenai___tulu-3-…

js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)

目录 Proxy Reflect 静态方法 部分实例 Iterator 实际开发迭代器的使用实例 迭代器(Iterator)应用 Generator Proxy Proxy 是 ES6 中新增的对象 Proxy 是JavaScript中的内置对象,它提供了一种机制,可以拦截并自定义各种…

React 组件通信完整指南 以及 自定义事件发布订阅系统

React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…

mac中idea菜单工具栏没有git图标了

1.右击菜单工具栏 2.选中VCS&#xff0c;点击添加 3.搜索你要的工具&#xff0c;选中点击确定就添加了 4.回到上面一个界面&#xff0c;选中你要放到工具栏的工具&#xff0c;点击应用就好了 5.修改图标&#xff0c;快捷键或者右击选中编辑图标 6.选择你要的图标就好了

Linux实验报告7-文件管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)查看/etc/inittab文件的权限属性&#xff0c;并指出该文件的所有者以及文件所属组群。 (2)新建文件test&#xff0c;设置文件权限为r--r-----。 (3)新建文件test2&#xff0c;设系统中有用户study和用户组studygr…

CPT203 Software Engineering 软件工程 Pt.4 软件设计(中英双语)

文章目录 6. 设计概念6.1 Principle6.2 Concepts6.2.1 General design concepts&#xff08;常见的设计概念&#xff09;6.2.1.1 Abstraction&#xff08;抽象&#xff09;6.2.1.2 Modularity&#xff08;模块化&#xff09;6.2.1.3 Functional independence&#xff08;功能独…

JSON 系列之4:JSON_VALUE

JSON_VALUE的作用&#xff0c;简单来说&#xff0c;就是从JSON到SQL&#xff1a; SQL/JSON function JSON_VALUE selects JSON data and returns a SQL scalar or an instance of a user-defined SQL object type or SQL collection type (varray, nested table) 所以&#xff…

[wzoi]Help Bubu

题目描述: Bubu的书架上乱成一团了&#xff01;请帮助他一下吧&#xff01; 他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如&#xff0c;如果输的高度是30,30,31,31,32&#xff0c;那么混乱值为3,30,32,32,31的混乱度也是3&#xff0c;但31,32,31,32,…

嵌入式AI STM32部署卷积神经网络的魔法棒

基于STM32部署卷积神经网络控制设备方案-AI项目-STM32部署卷积神经网络方案-红外信号复制方案-轨迹识别 项目包含下述内容 硬件部分、PCB制板、BOM表文件等等 (Hardware)外壳、3D打印文件 (3D_print)软件程序、用于电子法棒的软件程序 AI Keil等等(Software)QT上位机动作识别…

【代码分析】Unet-Pytorch

1&#xff1a;unet_parts.py 主要包含&#xff1a; 【1】double conv&#xff0c;双层卷积 【2】down&#xff0c;下采样 【3】up&#xff0c;上采样 【4】out conv&#xff0c;输出卷积 """ Parts of the U-Net model """import torch im…

[Leetcode] 最大子数组和 [击败99%的解法]

解法1&#xff1a; 暴力解法 遍历每个元素&#xff0c;从它当前位置一直加到最后&#xff0c;然后用一个最大值来记录全局最大值。 代码如下&#xff1a; class Solution {public int maxSubArray(int[] nums) {long sum, max nums[len-1];for (int i0; i<nums.length;…

系统压力测试助手——stress-ng

1、背景 在系统性能测试和压力测试中&#xff0c;stress-ng 是一个非常强大的工具&#xff0c;广泛应用于对 Linux 系统进行各种硬件和软件方面的负载测试。它能够模拟多种极端负载情况&#xff0c;帮助开发人员和运维人员检查系统在高负载下的表现&#xff0c;以便发现潜在的…

计算机网络500题2024-2025学年度第一学期复习题库(选择、判断、填空)

一、单选题 1、&#xff08; &#xff09;是实现两个同种网络互连的设备 A. 网桥 B. 网关 C. 集线器 D. 路由器 2、10M以太网有三种接口标准&#xff0c;其中10BASE-T采用&#xff08; &#xff09; A. 双绞线 B. 粗同轴电缆 C. 细同轴电缆 D. 光纤 3、HDLC是哪…

在JavaScript文件中定义方法和数据(不是在对象里定以数据和方法,不要搞错了)

在对象里定以数据和方法看这一篇 对象字面量内定义属性和方法&#xff08;什么使用const等关键字&#xff0c;什么时候用键值对&#xff09;-CSDN博客https://blog.csdn.net/m0_62961212/article/details/144788665 下是在JavaScript文件中定义方法和数据的基本方式&#xff…

基于SpringBoot的垃圾分类系统设计与实现【源码+文档+部署讲解】

系统介绍 基于SpringBootVue实现的垃圾分类系统设计了三种角色、分别是管理员、垃圾分类管理员、用户&#xff0c;实现了个人中心、用户管理、垃圾分类管理员管理、垃圾分类管理、垃圾类型管理、垃圾图谱管理、系统管理等功能 技术选型 开发工具&#xff1a;idea2020.3Webst…

今日总结 2024-12-28

今天全身心投入到鸿蒙系统下 TCPSocket 的学习中。从最基础的 TCP 协议三次握手、四次挥手原理重新梳理&#xff0c;深刻理解其可靠连接建立与断开机制&#xff0c;这是后续运用 TCPSocket 无误通信的根基。在深入鸿蒙体系时&#xff0c;仔细研读了其为 TCPSocket 封装的 API&a…

springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失

这个包丢失了 启动不了 起因是pom中加入了 <tomcat.version></tomcat.version>版本指定&#xff0c;然后idea自动编译后&#xff0c;包丢了&#xff0c;删除这个配置后再也找不回来&#xff0c; 这个包正常在 <dependency><groupId>org.springframe…

前后端分离(对话框的使用)

1.首先先定义两个按钮(一个添加按钮&#xff0c;一个修改按钮) <el-button type"primary" click"openDialog(true)">添加员工</el-button> <el-button size"mini" click"openDialog(false, scope.row)">编辑</…

doris集群存储目录切换

doris集群存储目录切换 1. 背景 3节点集群&#xff0c;BE存储目录&#xff0c;因为运维原因。存储盘系统放在了一一起。 需要增加硬盘&#xff0c;并替换原有目录。 3节点集群&#xff0c;如果各个表都是3副本&#xff0c;可以实现轮流停机&#xff0c;方式处理。 但是业务…

【Maven_bugs】The project main artifact does not exist

背景&#xff1a;我想使用 maven-shade-plugin 打一个 fat jar 时报了标题中的错误&#xff0c;使用的命令是&#xff1a;org.apache.maven.plugins:maven-shade-plugin:shade -pl :shade-project。项目结构如下图&#xff0c;我想把子模块 shade-project 打成一个 fat jar&…