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);
}
此功能仅改变三维模型的三维坐标,不改变模型本身的形状。
AnyCAD应用——修改指定点,线,面的坐标实现物体移动的更多相关文章
- Arcpy处理修改shapefile FeatureClass 线要素坐标
需求:在开发的webgis系统中需要将道路矢量数据与谷歌地图瓦片叠加,谷歌地图瓦片在国家测绘局的要求是进行了偏移处理的,人称“火星坐标系GCJ_02”,道路数据是WGS-84坐标系下的经纬度坐标,现在 ...
- arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算)
arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算) 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 此地理处理工具 ...
- 【NX二次开发】Block UI 指定点
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 关于数据结构,剑指offer上面的
我很喜欢那些javascript解决的编程题,感觉非常的有意思.我在博客园上面看到了一个同学的博客,他一共发了34篇剑指offer的编程题,还给出了非常详细的解答. 接下来的工作,我做的就是搬运工,不 ...
- Unity3D 物体移动到指定点
transform.position=Vector3.MoveTowards(transform.position , Target.position, speed * Time.deltaTime) ...
- [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 ...
- node.js连接数据库登录注册,修改用户(页面的ajax请求)
首先给大家看一下目录结构,结构如下: index.html 首页(显示所有的用户信息) login.html 登录页 register.html 注册页 db.js 配置链接数据库参数 dbhelpe ...
- [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 ...
- OSG立体模式下动态修改相机远近裁剪面的实现
1. 非立体模式下动态修改相机远近裁剪面 class GLB_DLLCLASS_EXPORT CGlbGlobeClipHandler : public osg::NodeCallback { ...
- Sqlite插入、修改、删除表里面的数据
转载 2014年05月10日 10:38:21 标签: sqlite3 / 数据库 8688 转自:http://www.cnblogs.com/myqiao/archive/2011/07/13/2 ...
随机推荐
- Cesium 案例(九)示例中小程序集合(1)
因为这几天在忙一些客观上无法逃脱的事,没有大块时间对中大型案例进行学习,所以对官方案例中的代码不超过40行的程序进行了学习.我把他们放在一到两个随笔中. 注:[所有案例中最前面务必加上] 1 Cesi ...
- 太坑了吧!一次某某云上的redis读超时排查经历
一次排查某某云上的redis读超时经历 性能排查,服务监控方面的知识往往涉及量广且比较零散,如何较为系统化的分析和解决问题,建立其对性能排查,性能优化的思路,我将在这个系列里给出我的答案. 问题背景 ...
- 升级:Logical Upgrade升级MySQL5.6.26
升级需谨慎,事前先备份 MySQL升级的实质是对数据字典的升级,数据字典有:sys.mysql.information_schema.performance_schema . MySQL升级的两种方式 ...
- 【Spring注解驱动】(二)AOP及一些扩展原理
1 AOP动态代理简介及功能实现 1.1 简介 指在程序运行期间动态地将某段代码切入到指定方法的指定位置进行运行的方式. 1.2 功能实现测试 功能:实现在业务逻辑运行的时候将日志打印 ①导入aop模 ...
- CRC(Cyclic Redundancy Check)
CRC(循环冗余校验) [参考资料] https://en.wikipedia.org/wiki/Cyclic_redundancy_check https://wiki.segger.com/CRC ...
- 当 Amazon Lambda 遇上 Apache APISIX 可以擦出什么火花?
本文首先介绍了什么是 Serverless,以及为什么需要 Serverless:其次,讲述了一个好的网关在 Serverless 架构下的重要性,而 APISIX 就是这样的一个网关:最后,本文重点 ...
- 2021牛客OI赛前集训营-提高组(第二场)第三题 树数树题解
题目描述 牛牛有一棵 \(n\) 个点的有根树,根为 \(1\). 我们称一个长度为 \(m\) 的序列 \(a\) 是好的,当且仅当: \(\forall i \in (1,m]\),\(a_i\) ...
- 群论中的 Lagrange 定理
今天跟 hym 打球时讲到了这个东西,突然发现证明拉格朗日定理的思想有许多跟轨道-稳定集定理很像,所以这里又记录一下. 为了证明 Lagrange 定理,我们需要了解一些关于子群和陪集的性质. 首先给 ...
- 搭建一个简易框架 3秒创建一个WebApi接口
前端ajax请求数据,传递的参数都是一个json字符串,经过多次解析发现其实都是一个DataSet {"selectA1":[{"Name":"156 ...
- Prism Sample 4 View Discovery
前三节算是弄明白了Region是什么,但是定义了区域,怎样向区域中添加内容呢?内容是UserControl,即ViewA. 添加内容的方式有2种,一种叫View Discovery,一种叫View I ...