<RengaPlugin> <Name>MyPlugin</Name> <Version>1.0</Version> <Vendor>Vendor name</Vendor> <Copyright>Copyright text</Copyright> <RequiredAPIVersion>1.2</RequiredAPIVersion> <PluginFilename>MyPlugin.dll</PluginFilename> </RengaPlugin>
bool MyPlugin::initialize(const wchar_t * pluginPath) { auto countBricksAction = rengaapi::UIControls::createAction(); countBricksAction.setToolTip(rengabase::String(L" ")); auto primaryPanelExtension = rengaapi::UIControls::createToolPanelExtension(); primaryPanelExtension.addToolButton(countBricksAction); return true; }
//CountBricksHandler.h #pragma once #include <RengaAPI/IInvokable.h> class CountBricksHandler : public rengaapi::IInvokable { public: void invoke(); }; //CountBricksHandler.cpp #include "stdafx.h" #include "CountBricksHandler.h" void CountBricksHandler::invoke() {}
auto countBricksAction = rengaapi::UIControls::createAction(); countBricksAction.setToolTip(rengabase::String(L"Count bricks in walls")); countBricksAction.setTriggerHandler(&m_countBricksHandler);
//BricksCounter.h #pragma once namespace rengaapi { class Wall; } class BricksCounter { public: BricksCounter(int consumptionRatePerM3); int calculateBricks(); private: double calculateBricksVolume(); double calculateBricksVolumeInSingleWall(rengaapi::Wall* pWall); int calculateBricksCountInVolume(double bricksVolume); private: int m_consumptionRatePerM3; };
//BricksCounter.cpp #include "stdafx.h" #include "BricksCounter.h" #include <RengaAPI/Project.h> #include <RengaAPI/ModelObjectTypes.h> #include <RengaAPI/Wall.h> #include <RengaAPI/Materials.h> const wchar_t* c_briksMaterialName = L""; BricksCounter::BricksCounter(int consumptionRatePerM3) : m_consumptionRatePerM3(consumptionRatePerM3) { } int BricksCounter::calculateBricks() { double bricksVolume = calculateBricksVolume(); int bricksNumber = calculateBricksInVolume(bricksVolume); return bricksNumber; } double BricksCounter::calculateBricksVolume() { double result = 0.0; assert(rengaapi::Project::hasProject()); auto allObjects = rengaapi::Project::model().objects(); for (auto objectIt = allObjects.begin(); objectIt != allObjects.end(); ++objectIt) { if ((*objectIt)->type() == rengaapi::ModelObjectTypes::WallType) { rengaapi::Wall* pWall = dynamic_cast<rengaapi::Wall*>(*objectIt); assert(pWall != nullptr); result += calculateBricksVolumeInSingleWall(pWall); } } return result; } double BricksCounter::calculateBricksVolumeInSingleWall(rengaapi::Wall * pWall) { auto materialId = pWall->material(); rengaapi::LayeredMaterial wallMaterial; rengaapi::Materials::layeredMaterial(materialId, wallMaterial); auto materialLayers = wallMaterial.layers(); auto layerQuantityCollection = pWall->quantities().materialQuantities(); double bricksVolume = 0.0; for (size_t i = 0; i < materialLayers.size(); ++i) { if (materialLayers.get(i).material().name_() == rengabase::String(c_briksMaterialName)) { auto oVolumeMeasure = layerQuantityCollection.get(i).netVolume(); if (oVolumeMeasure.hasValue()) { bricksVolume += oVolumeMeasure.getValue()->inMeters3(); } } } return bricksVolume; } int BricksCounter::calculateBricksInVolume(double bricksVolume) { return static_cast<int>(bricksVolume * m_consumptionRatePerM3); }
// CountBricksHandler.cpp #include "stdafx.h" #include "CountBricksHandler.h" #include "BricksCounter.h" #include <RengaAPI/Project.h> #include <RengaAPI/Message.h> const int c_bricksConsumptionRatePerM3 = 400; void CountBricksHandler::invoke() { if (!rengaapi::Project::hasProject()) { rengaapi::Message::showMessageBox(rengaapi::Message::Info, rengabase::String(L" MyPlugin"), rengabase::String(L" . .")); } else { BricksCounter counter(c_bricksConsumptionRatePerM3); int bricksCount = counter.calculateBricks(); std::wstring message = std::wstring(L" , : ") + std::to_wstring(bricksCount); rengaapi::Message::showMessageBox(rengaapi::Message::Info, rengabase::String(L" MyPlugin"), rengabase::String(message.data())); } }
Source: https://habr.com/ru/post/343010/