【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)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
