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 ...
随机推荐
- LLaMA:开放和高效的基础语言模型
LLaMA:开放和高效的基础语言模型 论文:https://arxiv.org/pdf/2302.13971.pdf 代码:https://github.com/facebookresearch/ll ...
- 四月二十三号java基础知识
1.异常是指在程序运行中由代码产生的一种错误2.按照错误的性质将错误分为语法错.语义错.和逻辑错三种3.语法错是有由于违反程序设计语言的语言规则而产生的错误,如标识符未标明.表达式中运算符与操作数类型 ...
- JS 一些基本正则校验
记录下JS一些基本正则校验,以备后需. 1 //手机号码校验 2 function formCheckMobilePhone(data) { 3 var pattern = /^[1-9]{1}\d{ ...
- python过滤列表元素
li = [1, 2, 3, 4, 5, 6] def fun(item, num): if item == num: return 1 else: return 0 def fun1(item, n ...
- 2023年成都.NET线下技术沙龙活动即将到来!
MASA技术团队联合成都.NET俱乐部,将在成都市举办一场.NET线下技术沙龙,为.NET开发者创造一次交流学习的契机,我们邀请到的几位技术大咖,将会围绕各自的主题向大家分享他们的技术心得. 本场沙龙 ...
- 2023高效的mysql 随机语句 200万数据为例 用了 0.0030秒
是的,如果数据表中有200万条记录,使用 ORDER BY RAND() 这种方式来随机选择记录会非常慢,因为 MySQL 需要对整个表进行排序,然后再返回指定数量的记录.这个过程需要消耗大量的时间和 ...
- Arch Linux安装笔记
最近有些厌倦Windows,所以想尝试一下Linux,选择Arch的原因不再赘述,建议以ArchLinux官方安装指南为主,这篇笔记只是方便我自己安装而写的,仅供参考. 1. 安装前的准备 1.1 ...
- Spring源码:Bean的生命周期(二)
前言 让我们继续讲解Spring的Bean实例化过程.在上一节中,我们已经讲解了Spring是如何将Bean定义加入到IoC容器中,并使用合并的Bean定义来包装原始的Bean定义.接下来,我们将继续 ...
- 「微服务」这10道Consul面试题值得一看
前言 Consul 是一种非常强大的分布式服务发现和配置管理工具,它可以帮助开发人员和运维人员更好地管理和维护分布式系统. 但是,使用 Consul 也需要投入一定的人力和物力,需要根据实际情况进行选 ...
- 2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题
2023-03-29:第一行有一个正整数n(3<=n<=100000),代表小A拟定的路线数量 第二行有n个正整数,第i个代表第i条路线的起始日期 第三行有n个正整数,第i个代表第i条路线 ...