当前位置: 首页 > news >正文

【Rhino】【Python】根据contour创建地形mesh

将surface生成open curve封闭

#coding=utf-8
import rhinoscriptsyntax as rs
import mathdef adjust_endpoints():# 获取指定图层中的所有曲线all_objects = rs.ObjectsByLayer("Level 19")if not all_objects:print("在'Level 19'图层中未找到对象")return# 筛选有效的开放曲线open_curves = []invalid_objects = 0for obj in all_objects:try:# 检查对象是否为曲线且是否有效if rs.IsCurve(obj) and not rs.IsCurveClosed(obj):# 尝试获取端点try:start = rs.CurveStartPoint(obj)end = rs.CurveEndPoint(obj)if start and end:open_curves.append({'curve': obj,'start': start,'end': end})except:invalid_objects += 1print("无法获取曲线端点: " + str(obj))else:invalid_objects += 1except:invalid_objects += 1print("无效对象: " + str(obj))if not open_curves:print("未找到有效的开放曲线")returnprint("找到 {0} 条有效开放曲线".format(len(open_curves)))if invalid_objects > 0:print("跳过 {0} 个无效对象".format(invalid_objects))# 关闭重绘以提高性能rs.EnableRedraw(False)try:adjustments_made = 0# 遍历所有曲线的端点for i in range(len(open_curves)):curve1 = open_curves[i]# 检查终点end1 = curve1['end']closest_point = Nonemin_distance = 5000# 查找最近的端点for j in range(len(open_curves)):if i == j:continuecurve2 = open_curves[j]# 检查与其他曲线起点的距离dist_es = rs.Distance(end1, curve2['start'])if 0 < dist_es < min_distance:min_distance = dist_esclosest_point = curve2['start']# 检查与其他曲线终点的距离dist_ee = rs.Distance(end1, curve2['end'])if 0 < dist_ee < min_distance:min_distance = dist_eeclosest_point = curve2['end']# 如果找到最近点,调整当前曲线的终点if closest_point and min_distance < 5000:try:# 获取原始控制点points = rs.CurvePoints(curve1['curve'])if points:# 修改最后一个控制点的坐标points[-1] = closest_point# 创建新曲线new_curve = rs.AddCurve(points)if new_curve:# 复制原始曲线的属性rs.MatchObjectAttributes(new_curve, curve1['curve'])# 删除原始曲线rs.DeleteObject(curve1['curve'])# 更新曲线信息curve1['curve'] = new_curvecurve1['end'] = closest_pointadjustments_made += 1print("调整了曲线端点 - 距离: {:.2f}".format(min_distance))except Exception as e:print("调整曲线时出错: " + str(e))continueprint("\n完成端点调整")print("- 成功调整: {0} 条曲线".format(adjustments_made))except Exception as e:print("发生错误: " + str(e))finally:rs.EnableRedraw(True)# 运行函数
adjust_endpoints()

绘制方向线,调整相交的contour的z坐标值

#coding=utf-8
import rhinoscriptsyntax as rs
import Rhino.Geometry as rgdef sort_intersection_points(points):# 按X坐标排序交点return sorted(points, key=lambda pt: pt.X)def adjust_curves_by_intersection():# 获取指定图层的直线direction_lines = rs.ObjectsByLayer("Contour::Direction")if not direction_lines:print("未找到方向线")return# 获取Level 19图层的曲线level_curves = rs.ObjectsByLayer("Level 19")if not level_curves:print("未找到Level 19的曲线")return# 筛选开放曲线open_curves = [crv for crv in level_curves if rs.IsCurve(crv) and not rs.IsCurveClosed(crv)]# 存储所有交点信息intersection_data = []# 关闭重绘以提高性能rs.EnableRedraw(False)try:# 获取所有交点for line in direction_lines:for curve in open_curves:intersection_points = rs.CurveCurveIntersection(line, curve)if intersection_points:for intersection in intersection_points:# 交点信息格式:[交点坐标, 相关曲线]intersection_data.append({'point': intersection[1],  # 交点坐标'curve': curve            # 相交的曲线})if not intersection_data:print("未找到交点")return# 按X坐标排序交点intersection_data.sort(key=lambda x: x['point'].X)# 设置初始Z坐标base_z = -110000z_increment = 5000# 记录已处理的曲线,避免重复处理processed_curves = set()# 依次处理每个交点对应的曲线for idx, data in enumerate(intersection_data):curve = data['curve']# 如果曲线已经处理过,跳过if curve in processed_curves:continue# 计算新的Z坐标new_z = base_z + (idx * z_increment)# 获取曲线的控制点points = rs.CurvePoints(curve)if points:# 调整所有控制点的Z坐标new_points = []for pt in points:new_pt = rs.CreatePoint(pt.X, pt.Y, new_z)new_points.append(new_pt)# 创建新曲线new_curve = rs.AddCurve(new_points)if new_curve:# 复制原始曲线的属性rs.MatchObjectAttributes(new_curve, curve)# 删除原始曲线rs.DeleteObject(curve)# 标记曲线为已处理processed_curves.add(curve)print("调整曲线Z坐标至: {0}".format(new_z))print("\n完成调整")print("- 处理曲线数量: {0}".format(len(processed_curves)))except Exception as e:print("发生错误: " + str(e))finally:rs.EnableRedraw(True)# 运行函数
adjust_curves_by_intersection()

在这里插入图片描述

project pile onto Contour for obtaining Bottom level

#coding=utf-8
import rhinoscriptsyntax as rs
import Rhino.Geometry as rg
import scriptcontext as scdef get_bottom_levels():# 获取PILE图层中的所有对象pile_curves = rs.ObjectsByLayer("PILE")if not pile_curves:print("在PILE图层中未找到对象")return# 获取Contour::Mesh图层中的mesh对象mesh_objects = rs.ObjectsByLayer("Contour::Mesh")if not mesh_objects:print("在Contour::Mesh图层中未找到mesh对象")returnprint("找到 {0} 个mesh对象".format(len(mesh_objects)))# 筛选出封闭曲线closed_curves = []for curve in pile_curves:if rs.IsCurve(curve) and rs.IsCurveClosed(curve):degree = rs.CurveDegree(curve)if degree == 2:closed_curves.append(curve)if not closed_curves:print("未找到符合条件的封闭曲线")returnprint("找到 {0} 个封闭曲线".format(len(closed_curves)))# 关闭重绘以提高性能rs.EnableRedraw(False)try:# 使用单个mesh对象(假设只有一个地形mesh)mesh_obj = mesh_objects[0]# 直接从文档中获取meshmesh = sc.doc.Objects.Find(mesh_obj).Geometryif not mesh:print("无法获取有效的mesh几何体")returnprint("成功获取mesh几何体")# 为每个封闭曲线处理投影点processed_count = 0for curve in closed_curves:try:# 获取曲线的中心点bbox = rs.BoundingBox(curve)if not bbox:print("无法获取曲线边界框,曲线ID: " + str(curve))continue# 获取中心点坐标center_x = (bbox[0].X + bbox[6].X) / 2center_y = (bbox[0].Y + bbox[6].Y) / 2# 创建一条从高处向下的射线ray_start = rg.Point3d(center_x, center_y, 10000)ray_dir = rg.Vector3d(0, 0, -1)  # 向下的方向ray = rg.Ray3d(ray_start, ray_dir)# 计算射线与mesh的交点intersection_result = rg.Intersect.Intersection.MeshRay(mesh, ray)if intersection_result >= 0:  # 如果找到交点# 计算交点的实际位置intersection_point = ray_start + ray_dir * intersection_resultbottom_level = intersection_point.Z# 添加或更新属性rs.SetUserText(curve, "bottom level", str(bottom_level))processed_count += 1if processed_count % 50 == 0:  # 每处理50个打印一次进度print("已处理 {0} 个曲线对象".format(processed_count))else:print("未找到投影点,曲线ID: " + str(curve))except Exception as e:print("处理曲线对象时出错: " + str(e))print("问题曲线ID: " + str(curve))continueprint("\n完成处理")print("- 成功处理: {0} 个曲线对象".format(processed_count))except Exception as e:print("发生错误: " + str(e))finally:rs.EnableRedraw(True)# 运行函数
get_bottom_levels()

相关文章:

【Rhino】【Python】根据contour创建地形mesh

将surface生成open curve封闭 #codingutf-8 import rhinoscriptsyntax as rs import mathdef adjust_endpoints():# 获取指定图层中的所有曲线all_objects rs.ObjectsByLayer("Level 19")if not all_objects:print("在Level 19图层中未找到对象")return#…...

蓝桥杯软件赛系列---lesson1

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们今天会再开一个系列&#xff0c;那就是蓝桥杯系列&#xff0c;我们会从最基础的开始讲起&#xff0c;大家想要备战明年蓝桥杯的&#xff0c;让我们一起加油。 工具安装 DevC…...

NanoLog起步笔记-1

nonolog起步笔记-1 背景与上下文写在前面Nanolog与一般的实时log的异同现代log的一般特性Nanolog的选择 背景与上下文 因为工作中用到了NanoLog。有必要研究一下。 前段时间研究了许多内容&#xff0c;以为写了比较详实的笔记&#xff0c;今天找了找&#xff0c;不仅笔记没找到…...

汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集

本数据集支持YOLO&#xff0c;COCO&#xff0c;VOC三种格式标记汽车车牌&#xff0c;无论是新能源汽车还是油车都能识别标记&#xff0c;该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70&#xff05; 2800图片 有效集 20&#xff05; 800图片 测…...

leetcode33.搜索旋转排序数组

整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..…...

Ansible自动化运维(三)playbook剧本详解

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …...

通过PS和Unity制作2D动画之二:IK的使用

一、IK的概念 IK&#xff1a;Inverse Kinematics&#xff0c;反向动力学。 &#xff08;1&#xff09;正向动力学 在骨骼动画中&#xff0c;构建骨骼的方法被称为正向动力学。它的表现形式是&#xff1a;子骨骼&#xff08;关节&#xff09;的位置根据父骨骼&#xff08;关节…...

图像边缘检测原理和常用检测算子及MATLAB实现

一、边缘和边缘检测的概念 图像边缘是指图像中灰度值发生急剧变化的地方&#xff0c;这些变化通常对应于图像中物体的轮廓、边界或纹理的突变处。在数字图像处理中&#xff0c;边缘是图像的一个重要特征&#xff0c;它包含了关于物体形状、位置和大小等关键信息。 边缘检测是数…...

企业经营数据分析系统:提升决策能力的利器

搭建企业经营数据分析系统是当今企业绕不开的话题&#xff0c;企业想要在竞争激烈的市场当中突围而出&#xff0c;需要对于企业内部的各种数据了然于胸&#xff0c;同时对于外部的数据也有敏锐的把握能力&#xff0c;因此企业构建自身的经营性数据分析系统就显得尤其重要。作为…...

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…...

Oracle 数据库中SERIALLY_REUSABLE包是一种特殊的包类型

1、SERIALLY_REUSABLE 包概述 在 Oracle 数据库中&#xff0c;SERIALLY_REUSABLE包是一种特殊的包类型。这种包的目的是为了更有效地利用内存&#xff0c;特别是在高并发环境下。当一个会话调用SERIALLY_REUSABLE包中的过程或函数时&#xff0c;该包的状态&#xff08;包括变量…...

css基础记录

基础 选择器 复合选择器 后代选择器 div p {}; 类似如上,找到div中所有的后代,注意是所有的后代 子代选择器 > div > a 只选择div的儿子中有a的 并集选择器 用逗号,分隔 p,div,span,h1 { … } 一般一行写一个 CSS元素显示模式 分为块元素,行内元素 块元素 特点…...

Python后端 -- 万字长文全面解析Django框架

自从2005年诞生以来&#xff0c;Django因其“开发速度快、安全性高”的特点迅速成为许多开发者的首选。无论是小型的个人项目&#xff0c;还是大型的企业应用&#xff0c;Django都能游刃有余地满足需求。我们将从Django的基础知识带你全面掌握Django&#xff0c;从基础知识到高…...

el-thee懒加载删除某条数据 ,el-thee懒加载重置,el-thee刷新某个节点

一、懒加载的tree已经全部展开&#xff0c;外部点击删除的时候不需要重新展开点击获取下一层数据 <template> <el-treeref"tree":data"treeData":props"defaultProps"render-after-expandhighlight-currentlazy:expand-on-click-node&q…...

【PyQt5教程 四】Qt Designer 样式表(styleSheet)实现基本小部件的自定义动态效果和资源浏览器背景添加方法

目录 一、成果演示&#xff1a; 二、样式表的使用方法: &#xff08;1&#xff09;样式表语法和属性&#xff1a; &#xff08;2&#xff09;样式表代码示例&#xff1a; &#xff08;3&#xff09;伪类和状态&#xff1a; &#xff08;4&#xff09;复合选择器&#xff…...

【git】--- 通过 git 和 gitolite 管理单仓库的 SDK

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…...

计算机网络之NAT、代理服务、内网穿透、内网打洞

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论…...

2024-金盾信安杯线上赛 WP

Misc 大赛宗旨 记事本打开&#xff0c;一眼零宽隐写 B 神工具一把梭&#xff0c;得到一串 base 编码 base64 解码得到 flag flag 值&#xff1a;flag{5d5555fa-1303-4b43-8eef-d6ea7c64c361} esab 根据题目 esab 可以发现这正是 base 的逆向&#xff0c;所以可以先逆向一下…...

MySQL 基础架构

MySQL的基础架构主要由三大核心部分构成&#xff0c;以下是详细的解析&#xff1a; 一、连接层 连接层是客户端与MySQL数据库之间的桥梁&#xff0c;主要负责通信和身份验证&#xff0c;确保数据交换的安全与稳定。具体来说&#xff0c;它负责以下任务&#xff1a; 建立连接…...

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...