luceda ipkiss教程 43:画渐变圆弧型波导

news2024/11/28 18:49:24

案例分享:
在这里插入图片描述

from si_fab import all as pdk
import ipkiss3.all as i3
from ipcore.properties.restrictions import RestrictTuple
from ipkiss.geometry.shapes.modifiers import __ShapePathBase__
import numpy as np
from math import atan2

class ShapePathTaperExtended(__ShapePathBase__):
    """ Tapered path with extended ends based on a shape. """
    extension = i3.Tuple2Property(
        restriction=RestrictTuple((float)),
        doc="extension of the path shape at start and end: (start, end)"
    )
    end_path_width = i3.PositiveNumberProperty(doc="end width of path")
    start_path_width = i3.PositiveNumberProperty(doc="start width of path")

    def _default_end_path_width(self):
        return self.path_width

    def _default_path_width(self):
        return self.start_path_width

    def _default_extension(self):
        return 0., 0.

    def __init__(self, original_shape, start_path_width, end_path_width, **kwargs):
        super(ShapePathTaperExtended, self).__init__(
            original_shape=original_shape,
            start_path_width=start_path_width,
            end_path_width=end_path_width,
            **kwargs)

    def define_points(self, pts):
        # TODO: include start_face_angle and end_face_angle in the calculations
        start_ext, end_ext = self.extension
        west_coords = i3.Shape()
        east_coords = i3.Shape()
        orig_shp = i3.Shape(self.__get_original_shape_without_straight_angles__())
        start_angle, end_angle = orig_shp.get_face_angles()
        if len(orig_shp) == 0 or np.isclose(orig_shp.length(), 0.):
            return pts
        # begin
        orig_shp[0] = orig_shp[0].move_polar(-start_ext, start_angle)
        # end
        orig_shp[-1] = orig_shp[-1].move_polar(end_ext, end_angle)
        dist = [i3.distance(orig_shp[_], orig_shp[_ + 1]) for _ in range(len(orig_shp) - 1)]
        widths = [(self.end_path_width - self.path_width) * np.sum(dist[:_]) / np.sum(dist) + self.path_width for _ in
                  range(len(orig_shp))]
        coords = orig_shp.points
        n_points = len(coords)
        start_angle, end_angle = orig_shp.get_face_angles()
        # middle
        for i in range(n_points):
            x = coords[i][0]
            y = coords[i][1]
            if i == 0:
                angle1 = i3.DEG2RAD * start_angle
                angle2 = atan2(coords[i + 1][1] - y, coords[i + 1][0] - x)
            elif i == n_points - 1:
                angle1 = atan2(y - coords[i - 1][1], x - coords[i - 1][0])
                angle2 = i3.DEG2RAD * end_angle
            else:
                angle1 = atan2(y - coords[i - 1][1], x - coords[i - 1][0])
                angle2 = atan2(coords[i + 1][1] - y, coords[i + 1][0] - x)
            angle = angle1 + 0.5 * (angle2 - angle1 + np.pi) % (np.pi) - 0.5 * np.pi
            turn = (angle2 - angle1) % (2 * np.pi)
            ca = np.cos(angle)
            sa = np.sin(angle)
            if turn == np.pi and i not in [0, n_points - 1]:
                i3.LOG.error("Path to Boundary conversion is not possible with paths that turn 180 degree at a node")
                raise SystemExit
            w = 0.5 * widths[i] / np.abs(np.cos(0.5 * turn))
            c_west = (x - w * sa, y + w * ca)
            c_east = (x + w * sa, y - w * ca)
            west_coords.append(c_west)
            east_coords.append(c_east)
        east_coords.reverse()
        pts.extend(west_coords)
        pts.extend(east_coords)
        pts.append(west_coords[0])
        return pts


class gradient_arc(i3.PCell):
    class Layout(i3.LayoutView):
        radius = i3.PositiveNumberProperty(doc="Radius of the central bends", default=100.0)
        def _generate_elements(self, elems):
            shape_wg1 = [
                (0.0, 0.0),
                (self.radius, 0),
                (self.radius, self.radius),
                (self.radius, 2 * self.radius),
                (0, 2 * self.radius),
            ]
            shape_wg1_path = i3.ShapeRound(original_shape=shape_wg1, radius=self.radius)
            elems += i3.Boundary(layer=i3.TECH.PPLAYER.SI,
                                 shape=ShapePathTaperExtended(
                                     original_shape=shape_wg1_path,
                                     start_path_width=10,
                                     end_path_width=1,
                                 ))
            return elems


if __name__ == '__main__':
    gradient_arc().Layout().visualize()


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

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

相关文章

spring boot整合mybatis进行部门管理管理的增删改查

部门列表查询: 功能实现: 需求:查询数据库表中的所有部门数据,展示在页面上。 准备工作: 准备数据库表dept(部门表),实体类Dept。在项目中引入mybatis的起步依赖,mysql的…

【ArcGIS Pro微课1000例】0052:基于SQL Server创建企业级地理数据库案例

文章目录 环境搭建创建企业级数据库连接企业级数据库环境搭建 ArcGIS:ArcGIS Pro 3.0.1Server.ecp:版本为10.7SQL Server:版本为SQL Server Developer 2019创建企业级数据库 企业级地理数据库的创建需要通过工具箱来实现。工具位于:数据管理工具→地理数据库管理→创建企业…

20 套监控平台统一成 1 套 Flashcat,国泰君安监控选型提效之路

author:宋庆羽-国泰君安期货 运维工作最重要的就是维护系统的稳定性,其中监控是保证系统稳定性很重要的一环。通过监控可以了解系统的运行状态,及时发现问题和系统隐患,有助于一线人员快速解决问题,提高业务系统的可用时长。 作为…

C#网络编程(System.Net命名空间)

目录 一、System.Net命名空间 1.Dns类 (1)示例源码 (2)生成效果 2.IPAddress类 (1)示例源码 (2)生成效果 3.IPEndPoint类 (1) 示例源码 &#xff0…

中东电商指南分享!盘点中东四大跨境电商平台

提到跨境电商新蓝海,就不得不想起土豪聚集地 ——中东,中东地区拥有庞大的人口、高人均GDP、强大的消费能力以及广泛普及的互联网,但外出购物却相对不便,正是这一特点为中东跨境电商市场创造了巨大的优势。随着中东地区电商的崛起…

excel做预测的方法集合

一. LINEST函数 首先,一元线性回归的方程: y a bx 相应的,多元线性回归方程式: y a b1x1 b2x2 … bnxn 这里: y - 因变量即预测值x - 自变量a - 截距b - 斜率 LINEST的可以返回回归方程的 截距(a) 和 斜…

macOS Big Sur/Mac电脑安装vscode显示您没有权限来打开应用程序‘Visual Studio Code‘ 请联系您的电脑或网络管理员问题修复

错误方法 首先我以为我的权限不足。,需要去用户群组里设置。结果根本不是这个的问题。 1.在系统偏好设置->用户与群组检查了一下我的用户是不是管理员 结果发现是管理员 2.根据苹果提示,右键我的文件夹->显示简介->最下面的共享与权限 解锁&…

【K8s】Kubernetes CRD 介绍(控制器)

文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具…

python的extend函数详解

文章目录 语法功能示例例1:添加列表例2:添加元组例3:添加集合例4:添加字典(只添加键)例5:添加字符串例6:混合类型扩展例7:扩展空列表或不可迭代对象 注意事项&#xff1a…

❀dialog命令运用于linux❀

目录 ❀dialog命令运用于linux❀ msgbox部件(消息框) yesno部件(yesno框) inputbox部件(输入文本框) textbox部件(文本框) menu部件(菜单框) fselect部…

GeoPandas初体验:它是什么,我用它展示一下shp矢量数据

GeoPandas 是一个开源的 Python 库,用于处理地理空间数据。它扩展了 Pandas 这个流行的 Python 数据操作库,增加了对地理数据类型和操作的支持。GeoPandas 结合了 Pandas、Matplotlib 和 Shapely 的功能,提供了一个易于使用且高效的工具&…

【SpringCache】快速入门 通俗易懂

1. 介绍 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: EHCache Caffeine Redis(常用…

《洛谷深入浅出进阶篇》p2568 GCD

P2568 GCD - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2568 大致题意&#xff1a;给定正整数n&#xff0c;求1< x,y<n 且 gcd&#xff08;x&#xff0c;y&#xff09;为素数的数对&#xff08;x&#xff0c;y&#xff09;有多少对。…

Power BI - 5分钟学习透视列

每天5分钟&#xff0c;今天介绍Power BI透视列功能 什么是透视列&#xff1f; 透视列就是把行数据转换成列数据&#xff0c;也就是大家在工作中常说的行转列。 如何进行逆透视操作&#xff1a; 1&#xff0c;导入的【Sales】表&#xff0c;样例内容如下&#xff1a; 2, 【Ho…

智能优化算法应用:基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.参考…

leetcode 面试题 02.02. 返回倒数第k个节点

提建议就是&#xff0c;有些题还是有联系的&#xff0c;建议就收看完 876.链表的中间节点&#xff08;http://t.csdnimg.cn/7axLa&#xff09;&#xff0c;再将这一题联系起来 面试题 02.02. 返回倒数第k个节点 题目&#xff1a; 实现一种算法&#xff0c;找出单向链表中倒数第…

2023年加拿大百倍股研究报告

前言 股市中的百倍股&#xff0c;即那些在短期内实现超过百倍增长的股票&#xff0c;常引发投资者的深度关注和震撼。这类股票的成功并非偶然&#xff0c;而是基于公司或行业坚实的基础和长期的努力。千际投行策划的系列百倍股报告旨在为投资者提供深刻的洞察力和启示&#xf…

题目:挑选子串(蓝桥OJ 1621)

题目描述&#xff1a; 解题思路&#xff1a; 采用双指针的快慢指针。与蓝桥OJ1372类似。 图解 题解&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e5 9; int a[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int n, m…

轮询分区的设置

终于可以写MPI了&#xff0c;没想到&#xff0c;刚开始就当头一棒&#xff0c;我按照之前的配置MPI环境&#xff0c;配置完成就报错 好家伙&#xff0c;仔细检查了每一个步骤都没找到问题&#xff0c;上网搜索了一些解决方案&#xff0c;也没有解决。所幸&#xff0c;在配置MPI…

dll动态链接库【C#】

1说明&#xff1a; 在C#中&#xff0c;dll是添加 【类库】生成的。 2添加C#的dll&#xff1a; &#xff08;1&#xff09;在VS中新建一个Windows应用程序项目&#xff0c;并命名为TransferDll。 &#xff08;2&#xff09;打开Windows窗体设计器&#xff0c;从工具箱中为窗体…