首页 > 其他分享 >AnyCAD应用——修改指定点,线,面的坐标实现物体移动

AnyCAD应用——修改指定点,线,面的坐标实现物体移动

时间:2023-07-01 13:34:15浏览次数:43  
标签:OnPropertyChanged nameof TargetPoint 物体 item GPnt 坐标 msg AnyCAD

课题需求: 三维模型位置随实物位置改变而动态改变的功能,通过顶点位置坐标的改变,修改模型在显示中的位置。


功能验证:目前,可通过选中顶点手动输入坐标的方式,模拟验证此功能。


首先,点击“文件”工具栏,选择导入实体,导入一个step文件,这是一种常用的三维实体模型格式。

 

void OnOpenModel()
{
var dlg = new Microsoft.Win32.OpenFileDialog
{
DefaultExt = ".stp",
Filter = "Models (*.igs;*.iges;*.stp;*.step;*.brep;*.stl)|*.igs;*.iges;*.stp;*.step;*.brep;*.stl"
};
if (dlg.ShowDialog() != true)
return;

SceneNode? node = null;
ProgressView pv = new ProgressView(() =>
{
var shape = ShapeIO.Open(dlg.FileName);
if (shape == null)
return;
node = BrepSceneNode.Create(shape, null, null, 0, false);
});
pv.ShowDialog();

if (node == null)
return;

mRenderView.ShowSceneNode(node);
mRenderView.ZoomAll();
}


然后,在导入的三维模型中选中某一点,即可在“操作对象”属性栏中看到该点在世界坐标系中的实际位置。

 

var item = itr.Current();
msg += $"\nNodeId: {item.GetNodeId()}";
msg += $"\nUserId: {item.GetUserId()}";
msg += $"\nShapeId: {item.GetShapeIndex()}";
msg += $"\nPrimitiveId: {item.GetPrimitiveIndex()}";
msg += $"\nType: {item.GetShapeType().ToString()}";
msg += $"\nTopoShapeId: {item.GetTopoShapeId().ToString()}";
var pt = item.GetPosition();
msg += $"\nPosition: {pt.x} {pt.y} {pt.z}";


如果需要修改该点的位置,可以点击“自定义位置调整”工具栏,在“目标位置”属性栏中输入目标坐标,或者使用鼠标拖动该点,即可将目标顶点移动到所需位置。并且,您可通过点击软件右上角位置方块,观察三维模型各个位置的动态变化。

 选择顶点

 ViewStateGuard.SetPickFilter(EnumShapeFilter.VertexEdgeFace);

 对应的XAML代码

<Expander Header="操作对象" IsExpanded="True">
<StackPanel Margin="7,7,7,0" Orientation="Vertical">
<StackPanel Orientation="Horizontal" Margin="0,0,0,7">
<au:AuStepButton Content="选择对象" Margin="0,0,7,0"
IsChecked ="{Binding SourceObjectChecked, Mode=OneWay}"
IsStateFocused="{Binding SourceObjectFocused, Mode=OneWay}"
StepName ="SourceObject"
Click="OnClickStep"/>
<au:AuImageButton Click="OnChoosePoint"
IsStateFocused="{Binding SourcePointFocused, Mode=OneWay}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,7">
<au:AuNumericBox Width="70" Value="{Binding SourcePointX}" Margin="0,0,7,0"/>
<au:AuNumericBox Width="70" Value="{Binding SourcePointY}" Margin="0,0,7,0"/>
<au:AuNumericBox Width="70" Value="{Binding SourcePointZ}" Margin="0,0,7,0"/>
</StackPanel>
</StackPanel>
</Expander>
<Expander Header="目标位置" IsExpanded="True">
<StackPanel Orientation="Horizontal" Margin="7,7,0,7">
<au:AuNumericBox Width="70" Value="{Binding TargetPointX}" Margin="0,0,7,0"/>
<au:AuNumericBox Width="70" Value="{Binding TargetPointY}" Margin="0,0,7,0"/>
<au:AuNumericBox Width="70" Value="{Binding TargetPointZ}" Margin="0,0,7,0"/>
</StackPanel>
</Expander>

对应的坐标变量

GPnt _SourcePoint = new GPnt();
[ExpandXYZ]
public GPnt SourcePoint
{
get => _SourcePoint;
set
{
_SourcePoint.SetXYZ(value.XYZ());
OnPropertyChanged(nameof(SourcePoint));
OnPropertyChanged(nameof(SourcePointX));
OnPropertyChanged(nameof(SourcePointY));
OnPropertyChanged(nameof(SourcePointZ));
}
}

GPnt _TargetPoint = new GPnt();
[ExpandXYZ]
public GPnt TargetPoint
{
get => _TargetPoint;
set
{
_TargetPoint.SetXYZ(value.XYZ());
OnPropertyChanged(nameof(TargetPoint));
OnPropertyChanged(nameof(TargetPointX));
OnPropertyChanged(nameof(TargetPointY));
OnPropertyChanged(nameof(TargetPointZ));

UpdateObject();
}
}

应用变换

void UpdateObject()
{
if (_SourceObject == null)
{
return;
}

var vec = new GVec(_SourcePoint, _TargetPoint);
var trf = Matrix4.makeTranslation(Vector3.From(vec));

_SourceObject.SetTransform(trf);
_SourceObject.RequestUpdate();

ViewContext.RequestUpdate(EnumUpdateFlags.Scene);
}


此功能仅改变三维模型的三维坐标,不改变模型本身的形状。

标签:OnPropertyChanged,nameof,TargetPoint,物体,item,GPnt,坐标,msg,AnyCAD
From: https://www.cnblogs.com/zsy010101/p/17519169.html

相关文章

  • Qt界面坐标
    x:左上角距屏幕左上角的水平距离y:左上角距屏幕左上角的竖直距离geometry几何属性:整个窗体的属性用frameGeometry(),客户区的属性用geometry()。#include"QtWidgets0628.h"#include<QtWidgets/QApplication>#include<qdebug.h>intmain(intargc,char*argv[]){QAp......
  • 如何获取页面上某个元素的坐标
    打开浏览器的F12控制台,在console内输入下面代码functiongetPosition(node){//获取元素相对于其父元素的left值varleftvarleft=node.offsetLeft;vartop=node.offsetTop;//取得元素的offsetParentcurrent=node.offsetParent;//一直循环直到根元素while(current!=nu......
  • Unity如何判断两物体相交
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclasscubemanger5:MonoBehaviour{publicGameObjectcubePrefab;publicintnumCubes;publicfloatminSize;publicfloatmaxSize;publicGameObject......
  • 【RS】基于ENVI给图片/影像定义坐标系
    ​        作为遥感工作者,有时会需要对图片或者影像进行镶嵌拼接的操作,但ENVI里的镶嵌需要图片/影像本身具有投影坐标系。那么问题就来了,如果我的图片没有坐标系,或者只知道图片中心点的经纬度坐标(GPS),那我们该如何进行镶嵌拼接操作呢?我们可以先给图片赋予一张投影坐标系,......
  • zemax光学设计-案例5-一个fTheta透镜与坐标断点
    案例5–f-theta透镜与坐标断点1、波长632nm2、ENPD=50mm3、F#=34、扫描角度10deg5、双胶合BK7+F26、视场0°即可目标:学习坐标断点(旋转反射镜改变光束位置)多重结构组态中,附加数据#:3(选择第三个面的第三个参数作为parameter)优化:由于只是学习目标断......
  • 案例5-一个fTheta透镜与坐标断点
    案例5–f-theta透镜与坐标断点1、波长632nm2、ENPD=50mm3、F#=34、扫描角度10deg5、双胶合BK7+F26、视场0°即可目标:学习坐标断点(旋转反射镜改变光束位置)多重结构组态中,附加数据#:3(选择第三个面的第三个参数作为parameter)优化:由于只是学习目标断点且双胶合透镜......
  • 线性代数-二次型-坐标变换笔记
    原来的二次型\(f\left(x_{1},x_{2},x_{3}\right)\)经过坐标变换变成了\(g\left(y_{1},y_{2},y_{3}\right)\)这个新的二次型$x^{\mathrm{T}}Ax$经过坐标变换变成$y^{\mathrm{T}}By$原来的二次型矩阵\(A\)变成了\(B\)(也是实对称矩阵)\(A\)和\(B\)之间的之间的关......
  • MapView Marker shadow坐标问题
    Drawabledrawable=app1.getResources().getDrawable(R.drawable.test);drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());OverlayItemoverlayitem2=newOverlayItem(mark,"Test","t");overlayitem2......
  • GD指纹算法,指纹识别算法源码出售 指纹识别算法极度优化极坐标三角运算算法,源码级出售,
    GD指纹算法,指纹识别算法源码出售指纹识别算法极度优化极坐标三角运算算法,源码级出售,拿到即可移植应用。另有符合国际ISO标准的指纹识别算法,实现各种算法的指纹模板通比和加密传输ID:8162999597738557021......
  • 【RS】使用ENVI对遥感影像进行坐标系转换,定义投影
    ​         ENVI是一个完整的遥感图像处理平台,广泛应用于科研、环境保护、气象、农业、林业、地球科学、遥感工程、水利、海洋等领域。目前ENVI已成为遥感影像处理的必备软件,包含辐射定标、大气校正、镶嵌裁剪、分类识别、阈值分割等多种功能。ENVI针对绝大部分的卫星......