Now that we’re able to place a grid of front tiles / segments, the only thing left is the placement of the right / top blind front panels – if the front tiles don’t fit properly. As always, we’re starting with a very basic test. The right blind front (if there’s one) will be placed on the bottom board, therefore start at `z == SimpleCabinetModel::kBoardThickness`.

TEST_N(FrontModelRightBlindFront) { SimpleCabinetModel simpleCabinet(2 * 200 + 2 * SimpleCabinetModel::kBoardThickness + 50, 3 * 150 + 2 * SimpleCabinetModel::kBoardThickness + 70, 800); FrontModel frontModel(simpleCabinet.GetFrontModelOrigin(), simpleCabinet.GetFrontWidth(), simpleCabinet.GetFrontHeight()); CHECK_EQUAL(SimpleCabinetModel::kBoardThickness, frontModel.GetRightZBlindFront()); }

Well, you could see that one coming, making the test pass is rather trivial – but it gets us on the track to more sophisticated functionality.

WorldCoord GetRightZBlindFront() const { return fOrigin.z; }

Let’s add another check to the test. The height of the right blind front should be the height of the front model.

CHECK_EQUAL(3 * 150 + 70, frontModel.GetRightBlindFrontHeight());

Quite obvious and should be easy to implement. There’s already an instance variable `fHeight` in the `FrontModel`:

WorldCoord frontModel.GetRightBlindFrontHeight() const { return fHeight; }

The third component needed to generate the geometry for the right blind front model is the base rectangular shape for the extrude. Another check for our test.

CHECK_EQUAL(WorldRect(SimpleCabinetModel::kBoardThickness + frontModel.GetNumColumns() * FrontModel::kSegmentWidth, FrontModel::kSegmentDepth, SimpleCabinetModel::kBoardThickness + simpleCabinet.GetFrontWidth(), 0), frontModel.GetRightBlindFrontBase());

Introducing two additional constants for the tile/segment’s width and depth, making the test pass requires a few lines of code:

class FrontModel { WorldRect GetRightBlindFrontBase() const { WorldCoord xStart = fOrigin.x + GetNumColumns() * kSegmentWidth; WorldCoord xEnd = fOrigin.x + fWidth; WorldRect r(0, 0, 0, 0); if (xStart != xEnd) r.Set(xStart, kSegmentDepth, xEnd, 0); return r; } };

The top blind front is tackled the same way – We need it’s z position, it’s x dimensions and it’s height. Not an awful lot to see there. Now let’s check if we’re able to generate Vectorworks geometry with this model.

void CreateFrom(const FrontModel& frontModel) { // ... WorldRect topBlindFrontBase = frontModel.GetTopBlindFrontBase(); if (topBlindFrontBase != WorldRect(0, 0, 0, 0)) { MCObjectHandle topBlindFront = gSDK->CreateExtrude(frontModel.GetTopZBlindFront(), frontModel.GetTopZBlindFront() + frontModel.GetTopBlindFrontHeight()); gSDK->AddObjectToContainer(gSDK->CreateRectangle(frontModel.GetTopBlindFrontBase()), topBlindFront); } WorldRect rightBlindFrontBase = frontModel.GetRightBlindFrontBase(); if (rightBlindFrontBase != WorldRect(0, 0, 0, 0)) { MCObjectHandle rightBlindFront = gSDK->CreateExtrude(frontModel.GetRightZBlindFront(), frontModel.GetRightZBlindFront() + frontModel.GetRightBlindFrontHeight()); gSDK->AddObjectToContainer(gSDK->CreateRectangle(frontModel.GetRightBlindFrontBase()), rightBlindFront); }

In fact, we are:

Tune in next weeks when you hear Dr. Bob say: “Let’s sum it up, post the code and I’m outta here”.