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

chili3d笔记18 出三视图调整

布尔合并有问题

import { IApplication, Logger, PubSub, ShapeNode } from "chili-core";
import { getProjectionEdges, gp_Pnt, LineSegmentList, OccShape, ProjectionResult2 } from "chili-wasm";import { Matrix3, Vector3 } from "three";
interface Segment {first: gp_Pnt;second: gp_Pnt;
}export class njsgcs_drawingView extends HTMLElement {private viewportCanvas2d: HTMLCanvasElement | null = null;private app: IApplication | null = null;constructor() {super();PubSub.default.sub("njsgcs_drawview", async (app: IApplication) => {Logger.info("njsgcs_drawview event triggered");if (this.viewportCanvas2d) {this.removeChild(this.viewportCanvas2d);this.viewportCanvas2d = null;}this.app = app;const canvas = this.createCanvas();this.appendChild(canvas);});}private drawProjectionEdges(ctx: CanvasRenderingContext2D, projection: ProjectionResult2) {// 清除画布ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);const margin = 100;const availableWidth = ctx.canvas.width ;const availableHeight = ctx.canvas.height ;const scale = 0.5; // 留点边距
const swapXYMatrix = new Matrix3().set(0, 1, 0,1, 0, 0,0, 0, 1
);
const swapXYMatrix2 = new Matrix3().set(0, 1, 0,1, 0, 0,0, 0, 1
);
const swapXYMatrix3 = new Matrix3().set(-1, 0, 0,0,1,  0,0, 0, 1
);// 定义各视图偏移const views = [{name: 'front',segmentsVisible: this.toArray(projection.f_visible),segmentsHidden: this.toArray(projection.f_hidden),matrix :  new Matrix3().scale(scale, scale).multiply(swapXYMatrix) .translate(margin, availableHeight-margin)},{ name: 'side',segmentsVisible: this.toArray(projection.s_visible),segmentsHidden: this.toArray(projection.s_hidden),matrix :  new Matrix3().scale(scale, scale).multiply(swapXYMatrix2) .translate(availableWidth-margin, availableHeight-margin)},{name: 'top',segmentsVisible: this.toArray(projection.t_visible),segmentsHidden: this.toArray(projection.t_hidden),matrix :  new Matrix3().scale(scale, scale).multiply(swapXYMatrix3) .translate(margin,margin)},];// 绘制每个视图for (const view of views) {// 实线:可见线this.drawSegments(ctx,view.segmentsVisible,false,view.matrix,);// 虚线:隐藏线this.drawSegments(ctx,view.segmentsHidden,true,view.matrix,);}}  private drawSegments(ctx: CanvasRenderingContext2D,segments: Segment[],isHidden: boolean,matrix: Matrix3,) {ctx.strokeStyle = isHidden ? "gray" : "black";ctx.lineWidth = isHidden ? 1 : 2;ctx.setLineDash(isHidden ? [5, 5] : []);Logger.info(matrix)for (const segment of segments) {if (segment && segment.first && segment.second) {ctx.beginPath();const transformedPoint = new Vector3(segment.first.x, segment.first.y, 1).applyMatrix3(matrix);ctx.moveTo(transformedPoint.x,transformedPoint.y);Logger.info(transformedPoint.x , transformedPoint.y )const transformedPoint2 = new Vector3(segment.second.x, segment.second.y, 1).applyMatrix3(matrix);ctx.lineTo(transformedPoint2.x,transformedPoint2.y);ctx.stroke();}}}private toArray(segmentList: LineSegmentList): Segment[] {const result = [];for (let i = 0; i < segmentList.size(); i++) {const segment = segmentList.get(i);if (segment) {result.push(segment);}}return result;}private createCanvas(): HTMLCanvasElement {if (!this.viewportCanvas2d) {this.viewportCanvas2d = document.createElement("canvas");this.viewportCanvas2d.width = 1200;this.viewportCanvas2d.height = 600;this.viewportCanvas2d.style.border = "1px solid #000";const ctx = this.viewportCanvas2d.getContext("2d");if (ctx) {const document = this.app!.activeView?.document;if (!document) return this.viewportCanvas2d;const geometries = document.selection.getSelectedNodes();const entities = geometries.filter((x) => x instanceof ShapeNode);Logger.info(`Number of entities: ${entities.length}`);for (const entity of entities) {const shapeResult = entity.shape;if (shapeResult.isOk) {const shape = shapeResult.value; // 获取IShape  // 检查是否为OccShape实例  if (shape instanceof OccShape) {const topoShape = shape.shape; // 访问TopoDS_Shape  const ProjectionEdges=getProjectionEdges(topoShape);this.drawProjectionEdges(ctx,ProjectionEdges)}}}}}return this.viewportCanvas2d!;}}customElements.define("njsgcs-drawing-view", njsgcs_drawingView);

相关文章:

  • 从零接入高德路径规划2.0:实现精准物流距离计算实战
  • 侧信道攻击的评估指标
  • SpringBoot电脑商城项目--新增收获地址
  • springboot入门之路(一)
  • 【AI Study】第四天,Pandas(3)- 数据处理进阶
  • Redission实现的分布式锁的可重入性
  • Linux驱动学习day5
  • 利用Java进行验证码的实现——算数验证码
  • vue | vue 插件化机制,全局注册 和 局部注册
  • docker|redis的面试题——七道
  • AppBarLayout+ CoordinatorLayout,ViewPager2为什么不会覆盖AppBarLayout
  • Saucer 页面嵌入使用举例
  • (LeetCode 每日一题) 2966. 划分数组并满足最大差限制 (贪心、排序)
  • 【java】@RestController和@Controller的区别
  • 【python 读取抖音/小红书/微博今日头条/百度热点等平台的热点新闻】
  • C++ Primer Plus 9.2.7 mutable
  • Windows11下搭建Raspberry Pi Pico编译环境
  • AutoHotkey 脚本生成器:一键打开网页到指定位置(v2版本:自定义位置)
  • C语言——枚举
  • 基于python的web系统界面登录
  • php网站怎么做的/安卓神级系统优化工具
  • 苏州高端网站建设咨询/电商运营推广
  • 1年网站/抖音推广合作方式
  • 教育发展基金会网站建设/百度指数热度榜
  • 网站建设 小白/谷歌浏览器2021最新版
  • 怎样做卡盟网站/品牌宣传策略有哪些