SolidWorks插件----实体坐标系移动到原点

通过PropertyManagerPage操作界面来实现移动坐标系到原点

通过2步完成:1、平移;2、旋转;

SolidWorks提供了一个接口完成平移和旋转(InsertMoveCopyBody2),但是经过我这边测试发现这个接口有点问题,旋转的时候我们需要调换Z和X的位置;

现在我讲讲具体的实现过程:

1、获取需要移动的实体;

2、指定移动的坐标系;(PropertyManagerPageSelectionbox可以指定选择对象)

代码:(获取坐标系对象)

// 获取当前活动的文档
ModelDoc2 swModel = (ModelDoc2)iSwApp.ActiveDoc;

PartDoc swPart = (PartDoc)swModel;
FeatureManager swFeatMgr = (FeatureManager)swModel.FeatureManager;

 获取参考坐标对象
SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;
CoordinateSystemFeatureData swCoordinateData = default(CoordinateSystemFeatureData);
for (int i = 1; i <= swSelMgr.GetSelectedObjectCount2(2); i++)
{
    if (swSelMgr.GetSelectedObjectType3(i, 2) == (int)swSelectType_e.swSelCOORDSYS)
    {
        Feature swTempFeat = (Feature)swSelMgr.GetSelectedObject6(i, 2);
        swCoordinateData = (CoordinateSystemFeatureData)swTempFeat.GetDefinition();
        break;
    }
}

坐标系对象不为空,我们来实现平移和旋转:

if (swCoordinateData != null)
{
	var transform = swCoordinateData.Transform;
	double[] vTransform = (double[])transform.ArrayData;

	// 第一步平移
	Feature swFeat1 = (Feature)swFeatMgr.InsertMoveCopyBody2(-vTransform[9], -vTransform[10],-vTransform[11], 
		0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false, 1);

	// Get the bodies to move
	object[] bodyArr = (object[])swPart.GetBodies2((int)swBodyType_e.swAllBodies, false);
	SelectBodies(swModel, bodyArr);

	// 获取X,Y,Z旋转角
	double RotAngleX = 0.0, RotAngleY = 0.0, RotAngleZ = 0.0;
	double ThetaX = 0.0, ThetaY = 0.0, ThetaZ = 0.0;
	// 注意:旋转顺序为x y z,切记不能调换
	if (vTransform[2] < 1)
	{
		if (vTransform[2] > -1)
		{
			ThetaY = Math.Asin(vTransform[2]);
			ThetaX = Math.Atan2(-vTransform[5], vTransform[8]);
			ThetaZ = Math.Atan2(-vTransform[1], vTransform[0]);
		}
		else
		{
			ThetaY = -Math.PI / 2;
			ThetaX = -Math.Atan2(vTransform[3], vTransform[4]);
			ThetaZ = 0;
		}
	}
	else
	{
		ThetaY = Math.PI / 2;
		ThetaX = Math.Atan2(vTransform[3], vTransform[4]);
		ThetaZ = 0;
	}

	RotAngleX = ThetaX;
	RotAngleY = ThetaY;
	RotAngleZ = ThetaZ;

	// 第二步旋转
	Feature swFeat2 = (Feature)swFeatMgr.InsertMoveCopyBody2(0.0, 0.0,0.0,
	0.0, 0.0, 0.0, 0.0, RotAngleZ, RotAngleY, RotAngleX, false, 1);
}

public void SelectBodies(ModelDoc2 swModel, object[] bodyArr)
{
	// Select and mark the bodies to move
	SelectionMgr swSelMgr = default(SelectionMgr);
	SelectData swSelData = default(SelectData);
	Body2 swBody = default(Body2);
	bool status = false;
	int i = 0;

	swSelMgr = (SelectionMgr)swModel.SelectionManager;
	swSelData = (SelectData)swSelMgr.CreateSelectData();

	if ((bodyArr == null))
		return;
	for (i = 0; i <= bodyArr.GetUpperBound(0); i++)
	{

		swBody = (Body2)bodyArr[i];
		swSelData.Mark = 1;
		status = swBody.Select2(true, swSelData);
	}

}

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值