// MatrixExtrudeDialolg.cpp ////////////////////////////////////////////////////////////////////// #include "c4d.h" #include "c4d_descriptiondialog.h" void DescriptionToolData::InitDefaultSettings(BaseDocument* pDoc, BaseContainer& data) { data.SetInt32(MDATA_INTERACTIVE, true); ToolData::InitDefaultSettings(pDoc, data); } Bool DescriptionToolData::GetDDescription(BaseDocument* doc, BaseContainer& data, Description* description, DESCFLAGS_DESC& flags) { if (description->LoadDescription(GetToolPluginId())) { flags |= DESCFLAGS_DESC_LOADED; return true; } return ToolData::GetDDescription(doc, data, description, flags); } Bool DescriptionToolData::GetDEnabling(BaseDocument* doc, BaseContainer& data, const DescID& id, const GeData& t_data, DESCFLAGS_ENABLE flags, const BaseContainer* itemdesc) { switch (id[0].id) { case MDATA_NEWTRANSFORM: break; case MDATA_DEFAULTVALUES: break; case MDATA_APPLY: if (!firstaction &&/*(*dcu->descid)[0].id!=MDATA_DEFAULTVALUES && */ (data.GetInt32(MDATA_INTERACTIVE) || data.GetInt32(MDATA_TEMPINTERACTIVE))) return false; break; case MDATA_INTERACTIVE: break; } return SUPER::GetDEnabling(doc, data, id, t_data, flags, itemdesc); } Bool DescriptionToolData::InteractiveModeling_Restart(BaseDocument* doc) { firstaction = false; return ::InteractiveModeling_Restart(doc); } Bool DescriptionToolData::InitTool(BaseDocument* doc, BaseContainer& data, BaseThread* bt) { firstaction = true; return true; } void DescriptionToolData::FreeTool(BaseDocument* doc, BaseContainer& data) { firstaction = true; } Bool DescriptionToolData::Message(BaseDocument* doc, BaseContainer& data, Int32 type, void* t_data) { if (type == MSG_TOOL_RESTART) { firstaction = true; } if (type == MSG_DESCRIPTION_COMMAND) { DescriptionCommand* dc = (DescriptionCommand*) t_data; if (dc->id[0].id == MDATA_NEWTRANSFORM) { InteractiveModeling_Restart(GetActiveDocument()); data.SetInt32(MDATA_TEMPINTERACTIVE, true); return true; } else if (dc->id[0].id == MDATA_DEFAULTVALUES) { InitDefaultSettings(doc, data); return true; } else if (dc->id[0].id == MDATA_APPLY || dc->id[0].id == IDC_OK) { AutoAlloc desc; if (desc != nullptr) // ITEM#65673 Bug in Modeling tools { BasePlugin* toolPlug = FindPlugin(GetToolPluginId(), PLUGINTYPE_TOOL); if (toolPlug != nullptr && toolPlug->GetDescription(desc, DESCFLAGS_DESC_0)) { BaseContainer *groupData = desc->GetParameterI(MDATA_COMMANDGROUP, nullptr); if (groupData != nullptr && groupData->GetBool(DESC_HIDE)) return true; BaseContainer *applyData = desc->GetParameterI(MDATA_APPLY, nullptr); if (applyData != nullptr && applyData->GetBool(DESC_HIDE)) return true; } } data.SetInt32(MDATA_TEMPINTERACTIVE, true); firstaction = false; } } if (type == MSG_DESCRIPTION_CHECKUPDATE) { DescriptionCheckUpdate* dcu = (DescriptionCheckUpdate*)t_data; dcu->drawflags |= MSG_DESCRIPTION_CHECKUPDATE_DOCUMENT | MSG_DESCRIPTION_CHECKUPDATE_SYNC; BasePlugin* plug = FindPlugin(GetToolPluginId(), PLUGINTYPE_TOOL); Int32 dirty = 0; if (plug) dirty = plug->GetDirty(DIRTYFLAGS_0); if (dirty != last_dirty && !firstaction &&/*(*dcu->descid)[0].id!=MDATA_DEFAULTVALUES && */ (data.GetInt32(MDATA_INTERACTIVE) || data.GetInt32(MDATA_TEMPINTERACTIVE))) { data.SetInt32(MDATA_TEMPINTERACTIVE, false); if (plug) dirty = plug->GetDirty(DIRTYFLAGS_0); last_dirty = dirty; AutoAlloc pActive; if (!doc || !pActive) return true; // undo the step before InteractiveModeling_Rewind(doc); ModelingCommandData mu; doc->GetActiveObjects(*pActive, GETACTIVEOBJECTFLAGS_CHILDREN); ModelingCommandData md; md.bc = &data; md.arr = pActive; md.doc = doc; md.flags = MODELINGCOMMANDFLAGS_CREATEUNDO; switch (doc->GetMode()) { case Mpoints: md.mode = MODELINGCOMMANDMODE_POINTSELECTION; break; case Mpolygons: md.mode = MODELINGCOMMANDMODE_POLYGONSELECTION; break; case Medges: md.mode = MODELINGCOMMANDMODE_EDGESELECTION; break; default: md.mode = MODELINGCOMMANDMODE_ALL; break; } //ATInteractStart(md.doc); StopAllThreads(); if (md.doc) md.doc->StartUndo(); SendModelingCommand(GetToolPluginId(), md); if (md.doc) md.doc->EndUndo(); //ATInteractEnd(md.doc); } } return ToolData::Message(doc, data, type, t_data); }