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

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

首先,点击“文件”工具栏,选择导入实体,导入一个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);
}

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

AnyCAD应用——修改指定点,线,面的坐标实现物体移动的更多相关文章

  1. Arcpy处理修改shapefile FeatureClass 线要素坐标

    需求:在开发的webgis系统中需要将道路矢量数据与谷歌地图瓦片叠加,谷歌地图瓦片在国家测绘局的要求是进行了偏移处理的,人称“火星坐标系GCJ_02”,道路数据是WGS-84坐标系下的经纬度坐标,现在 ...

  2. arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算)

    arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算) 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 此地理处理工具 ...

  3. 【NX二次开发】Block UI 指定点

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  4. 关于数据结构,剑指offer上面的

    我很喜欢那些javascript解决的编程题,感觉非常的有意思.我在博客园上面看到了一个同学的博客,他一共发了34篇剑指offer的编程题,还给出了非常详细的解答. 接下来的工作,我做的就是搬运工,不 ...

  5. Unity3D 物体移动到指定点

    transform.position=Vector3.MoveTowards(transform.position , Target.position, speed * Time.deltaTime) ...

  6. [LeetCode] Reaching Points 到达指定点

    A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). Given a ...

  7. node.js连接数据库登录注册,修改用户(页面的ajax请求)

    首先给大家看一下目录结构,结构如下: index.html 首页(显示所有的用户信息) login.html 登录页 register.html 注册页 db.js 配置链接数据库参数 dbhelpe ...

  8. [LeetCode] 780. Reaching Points 到达指定点

    A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). Given a ...

  9. OSG立体模式下动态修改相机远近裁剪面的实现

    1. 非立体模式下动态修改相机远近裁剪面 class GLB_DLLCLASS_EXPORT CGlbGlobeClipHandler : public osg::NodeCallback    { ...

  10. Sqlite插入、修改、删除表里面的数据

    转载 2014年05月10日 10:38:21 标签: sqlite3 / 数据库 8688 转自:http://www.cnblogs.com/myqiao/archive/2011/07/13/2 ...

随机推荐

  1. bat基本操作

    一.制作.bat文件:如:新建一个文本文件(.txt)--打开该文件,文件->另存为test.bat,编码为ANSI(支持中文编码): 二.常用写法: 1.输出使用echo:如:echo 文字: ...

  2. [Nginx/Linux/CENTOS]安装Nginx

    1 基本信息 服务器OS : Linux CENTSO 7.9 待安装的Nginx版本: NGINX 15.12 2 安装过程 step1 下载安装包 # cd /usr/local/software ...

  3. sync.Pool:提高Go语言程序性能的关键一步

    1. 简介 本文将介绍 Go 语言中的 sync.Pool并发原语,包括sync.Pool的基本使用方法.使用注意事项等的内容.能够更好得使用sync.Pool来减少对象的重复创建,最大限度实现对象的 ...

  4. 【Note】贪心

    感谢 $ \text{orzws/chy} $ 倾情授课. 目录 -1. 证明方式 0. 朴素贪心 AT2557 [ARC073C] Ball Coloring P2587 [ZJOI2008]泡泡堂 ...

  5. LeeCode 栈与队列问题(二)

    LeeCode 239: 滑动窗口最大值 题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右 ...

  6. linux CentOS 7上安装Chrome浏览器

    目录 linux CentOS 7上安装Chrome浏览器 添加Chrome浏览器的官方存储库,使用以下命令: 安装Chrome浏览器: 确认Chrome浏览器是否安装成功: linux CentOS ...

  7. .NET开源分布式锁DistributedLock

    一.线程锁和分布式锁 线程锁通常在单个进程中使用,以防止多个线程同时访问共享资源. 在我们.NET中常见的线程锁有: 自旋锁:当线程尝试获取锁时,它会重复执行一些简单的指令,直到锁可用 互斥锁: Mu ...

  8. 性能_1 Jmeter脚本编写

    一.万能法 先把项目启动 打开项目接口文档,接口文档: 一般是开发 特别注意事项:当你的接口请求参数为json格式时,一定要写请求头,请求头中一定要有 Content-Type: applicatio ...

  9. Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果

    Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果 准备香橙派一块!当前教程使用的是香橙派5 4G开发板 准备.NET环境 安装.NET Core依赖 sudo apt instal ...

  10. linux 引导过程和服务控制

    目录 一.引导分区 二.服务控制 三.运行级别 四.systemd初始化 五.模拟错误 一.引导分区 原理:引导分区是指在开机启动到进入系统这之间的过程 引导分区的过程:1.开机自检 自检顺序:BIO ...