MSCE | MDL常用功能(持续更新)

目录

1.判断是否是在3D Model中

2.按下CTRL+Z撤销功能函数

3.启用精确绘图

4.按住CTRL来进行多选

5.允许进行框选和划选(框选时按“Alt”键切换至划选模式)

6.是否需要用户再点击左键才开始处理元素

7.键盘按键相关的事件处理函数

8.实体拼接与扣除

9.格式化单位


1.判断是否是在3D Model中

在_OnInstall函数中通过“ACTIVEMODEL->Is3d()”

virtual bool _OnInstall()override;
bool 你的类名::_OnInstall()
{
	if (ACTIVEMODEL->Is3d())
	{
		return true;
	}
	return false;
}

 

2.按下CTRL+Z撤销功能函数

EnableUndoPreviousStep();

void 你的类名::_OnPostInstall()
{
	EnableUndoPreviousStep(); //用户输入“Ctrl+Z”时_OnUndoPreviousStep函数就会被调用,这样用户在输入有误的情况下可以撤销一些输入
}

例:

virtual void _OnUndoPreviousStep()override;

 

bvector<DPoint3d> m_ptVcr;

//撤销点
void 你的类名::_OnUndoPreviousStep()
{
	if (0 == m_ptVcr.size())
		return;
	m_ptVcr.pop_back();
	if (0 == m_ptVcr.size())
	{
		_EndDynamics();
	}
}

 

3.启用精确绘图

AccuDraw

//激活精确绘图
AccuDraw::GetInstance().Activate();

 

 

4.按住CTRL来进行多选

调用SOURCE_Pick来询问工具是否希望通过按住ctrl键来标识多个元素,而不是立即从单个位置处理元素。

virtual bool    _WantAdditionalLocate(DgnButtonEventCP ev)override;

 

bool 你的类名::_WantAdditionalLocate(DgnButtonEventCP ev)
{
	if (NULL == ev)
		return true;
	if (ev->IsControlKey())
		return true;
	return false;
}

5.允许进行框选和划选(框选时按“Alt”键切换至划选模式)

virtual UsesDragSelect  _AllowDragSelect()override { return USES_DRAGSELECT_Box; }

如果选中的元素中有我们不想处理的元素,可以重写_FilterAgendaEntries函数来实现

virtual bool    _FilterAgendaEntries()override;

例:选择时将ELLIPSE_ELM 类型剔除掉:

bool 你的类名::_FilterAgendaEntries()
{
	bool isInvalid = false;
	for (ElementAgenda::iterator iter = GetElementAgenda().begin(); iter != GetElementAgenda().end(); iter++)
	{
		if (ELLIPSE_ELM == (*iter).GetElementType())
		{
			(*iter).Invalidate();
			isInvalid = true;
		}
	}
	return isInvalid;
}

点选的时候我们仍然能选择圆,只不过是在构造ElementAgenda的时候将其移除了,此时就要重写我们前面介绍的_OnPostLocate函数,限制用户不能选中圆

例:

virtual bool    _OnPostLocate(HitPathCP path, WStringR cantAcceptReason)override;
bool 你的类名::_OnPostLocate(HitPathCP path, WStringR cantAcceptReason)
{
	if (ELLIPSE_ELM == path->GetHeadElem()->GetElementType())
	{
		cantAcceptReason = WString(L"Circ isn't valid");
		return false;
	}
	return __super::_OnPostLocate(path, cantAcceptReason);
}

 

6.是否需要用户再点击左键才开始处理元素

点击左键调用_OnDataButton函数中,如果拾取到新的元素的话,会调用_WantDynamics判断是否要启动动态绘制。然后会调用DgnElementSetTool::_NeedAcceptPoint

bool DgnElementSetTool::_NeedAcceptPoint ()
{
  if (_WantDynamics ())
      return true;

  return (SOURCE_Pick != _GetElemSource () || AccuSnap::GetInstance().UserWantsLocates() ? false : true);
}

如果返回true的话,_OnDataButton会直接返回。如果_NeedAcceptPoint返回false的话,会直接调用_ProcessAgenda开始执行元素修改的流程。_ProcessAgenda调用以后,最后调用_OnModifyComplete。

7.键盘按键相关的事件处理函数

主要有两个_OnModifierKeyTransition和_OnKeyTransition。

_OnModifierKeyTransition在Ctrl、Alt或者Shift按下时触发

_OnKeyTransition是在VK_TAB, VK_RETURN, VK_END, VK_HOME, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN这些按键的其中一个按下时触发。

8.实体拼接与扣除

拼接
SolidUtil::Modify::BooleanUnion(主体, 用于拼接的工具体, 工具体数量)
//扣除
SolidUtil::Modify::BooleanSubtract(同上)

9.格式化单位

获取图纸单位及比例,将局部坐标单位转换成世界单位(如为mm,则比例为1:1000,所以m_unit = 1000)

void UnitConversion(DPoint3d % point)
{
	ModelInfoCP pInfo = ACTIVEMODEL->GetModelInfoCP();
	m_unit = pInfo->GetUorPerStorage();

	point.x *= m_unit;
	point.y *= m_unit;
	point.z *= m_unit;
}

 

10.调用默认(Element Selection)

mdlState_startDefaultCommand()

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿尔兹

如果觉得有用就推荐给你的朋友吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值