【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
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们今天会再开一个系列,那就是蓝桥杯系列,我们会从最基础的开始讲起,大家想要备战明年蓝桥杯的,让我们一起加油。 工具安装 DevC…...
NanoLog起步笔记-1
nonolog起步笔记-1 背景与上下文写在前面Nanolog与一般的实时log的异同现代log的一般特性Nanolog的选择 背景与上下文 因为工作中用到了NanoLog。有必要研究一下。 前段时间研究了许多内容,以为写了比较详实的笔记,今天找了找,不仅笔记没找到…...
汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集
本数据集支持YOLO,COCO,VOC三种格式标记汽车车牌,无论是新能源汽车还是油车都能识别标记,该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70% 2800图片 有效集 20% 800图片 测…...
leetcode33.搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..…...
Ansible自动化运维(三)playbook剧本详解
Ansible自动化运维这部分我将会分为五个部分来为大家讲解 (一)介绍、无密钥登录、安装部署、设置主机清单 (二)Ansible 中的 ad-hoc 模式 模块详解(15)个 (三)Playbook 模式详解 …...
通过PS和Unity制作2D动画之二:IK的使用
一、IK的概念 IK:Inverse Kinematics,反向动力学。 (1)正向动力学 在骨骼动画中,构建骨骼的方法被称为正向动力学。它的表现形式是:子骨骼(关节)的位置根据父骨骼(关节…...
图像边缘检测原理和常用检测算子及MATLAB实现
一、边缘和边缘检测的概念 图像边缘是指图像中灰度值发生急剧变化的地方,这些变化通常对应于图像中物体的轮廓、边界或纹理的突变处。在数字图像处理中,边缘是图像的一个重要特征,它包含了关于物体形状、位置和大小等关键信息。 边缘检测是数…...
企业经营数据分析系统:提升决策能力的利器
搭建企业经营数据分析系统是当今企业绕不开的话题,企业想要在竞争激烈的市场当中突围而出,需要对于企业内部的各种数据了然于胸,同时对于外部的数据也有敏锐的把握能力,因此企业构建自身的经营性数据分析系统就显得尤其重要。作为…...
【49】AndroidStudio构建其他人开发的Android项目
(1)做Android软件开发,通常会看一些其他人开发的项目源码,当将这些项目的源码通过git clone到本地之后,用AndroidStudio进行打开时,通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…...
Oracle 数据库中SERIALLY_REUSABLE包是一种特殊的包类型
1、SERIALLY_REUSABLE 包概述 在 Oracle 数据库中,SERIALLY_REUSABLE包是一种特殊的包类型。这种包的目的是为了更有效地利用内存,特别是在高并发环境下。当一个会话调用SERIALLY_REUSABLE包中的过程或函数时,该包的状态(包括变量…...
css基础记录
基础 选择器 复合选择器 后代选择器 div p {}; 类似如上,找到div中所有的后代,注意是所有的后代 子代选择器 > div > a 只选择div的儿子中有a的 并集选择器 用逗号,分隔 p,div,span,h1 { … } 一般一行写一个 CSS元素显示模式 分为块元素,行内元素 块元素 特点…...
Python后端 -- 万字长文全面解析Django框架
自从2005年诞生以来,Django因其“开发速度快、安全性高”的特点迅速成为许多开发者的首选。无论是小型的个人项目,还是大型的企业应用,Django都能游刃有余地满足需求。我们将从Django的基础知识带你全面掌握Django,从基础知识到高…...
el-thee懒加载删除某条数据 ,el-thee懒加载重置,el-thee刷新某个节点
一、懒加载的tree已经全部展开,外部点击删除的时候不需要重新展开点击获取下一层数据 <template> <el-treeref"tree":data"treeData":props"defaultProps"render-after-expandhighlight-currentlazy:expand-on-click-node&q…...
【PyQt5教程 四】Qt Designer 样式表(styleSheet)实现基本小部件的自定义动态效果和资源浏览器背景添加方法
目录 一、成果演示: 二、样式表的使用方法: (1)样式表语法和属性: (2)样式表代码示例: (3)伪类和状态: (4)复合选择器ÿ…...
【git】--- 通过 git 和 gitolite 管理单仓库的 SDK
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…...
计算机网络之NAT、代理服务、内网穿透、内网打洞
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论…...
2024-金盾信安杯线上赛 WP
Misc 大赛宗旨 记事本打开,一眼零宽隐写 B 神工具一把梭,得到一串 base 编码 base64 解码得到 flag flag 值:flag{5d5555fa-1303-4b43-8eef-d6ea7c64c361} esab 根据题目 esab 可以发现这正是 base 的逆向,所以可以先逆向一下…...
MySQL 基础架构
MySQL的基础架构主要由三大核心部分构成,以下是详细的解析: 一、连接层 连接层是客户端与MySQL数据库之间的桥梁,主要负责通信和身份验证,确保数据交换的安全与稳定。具体来说,它负责以下任务: 建立连接…...
汽车升级到底应不应该设置“可取消“功能
最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
