69 auto registered = addCommand(registry,
"archspace.bootstrap.v1",
"Bootstrap ArchSpace site",
71 auto* doc = asArchSpace(
target);
72 const std::string* site = stringField(
request.payload,
"siteId");
73 const std::string* building = stringField(
request.payload,
"buildingId");
74 const std::string*
level = stringField(
request.payload,
"levelId");
76 if (!doc || !site || site->empty() || !building || building->empty() || !
level ||
78 return eve::editing::failed<editing::CommandPlan>(
79 editing::Status::Rejected,
editing::RuleId(
"archspace.editing.bootstrap"),
80 "ArchSpace bootstrap requires siteId, buildingId and levelId");
81 return planFrom(doc->makeBootstrap(*site, *building, *
level,
height),
84 if (!registered.ok())
return registered;
86 registered = addCommand(
87 registry,
"archspace.room.create.v1",
"Create ArchSpace rectangular room",
89 auto* doc = asArchSpace(
target);
90 const std::string*
level = stringField(
request.payload,
"levelId");
91 const std::string* room = stringField(
request.payload,
"roomId");
92 const std::string*
name = stringField(
request.payload,
"name");
93 double originX = 0, originZ = 0, sizeX = 0, sizeZ = 0, wallHeight = 3, wallThickness = 0.2,
95 if (!doc || !
level ||
level->empty() || !room || room->empty() ||
96 !readNumber(
request.payload,
"originX", originX,
true) ||
97 !readNumber(
request.payload,
"originZ", originZ,
true) ||
98 !readNumber(
request.payload,
"sizeX", sizeX,
true) ||
99 !readNumber(
request.payload,
"sizeZ", sizeZ,
true) ||
100 !readNumber(
request.payload,
"wallHeight", wallHeight,
false) ||
101 !readNumber(
request.payload,
"wallThickness", wallThickness,
false) ||
102 !readNumber(
request.payload,
"slabThickness", slabThickness,
false))
103 return eve::editing::failed<editing::CommandPlan>(
105 "ArchSpace room create requires levelId, roomId and size");
106 return planFrom(doc->makeCreateRectRoom(*
level, *room,
name ? *
name : *room, originX, originZ, sizeX, sizeZ,
107 wallHeight, wallThickness, slabThickness),
110 if (!registered.ok())
return registered;
112 registered = addCommand(
113 registry,
"archspace.wall.create.v1",
"Create ArchSpace wall",
114 [](editing::IEditableTarget&
target,
const editing::CommandRequest&
request) {
115 auto* doc = asArchSpace(
target);
116 const std::string*
level = stringField(
request.payload,
"levelId");
117 const std::string* wall = stringField(
request.payload,
"wallId");
118 const std::string*
name = stringField(
request.payload,
"name");
120 if (!doc || !
level ||
level->empty() || !wall || wall->empty() ||
126 return eve::editing::failed<editing::CommandPlan>(
127 editing::Status::Rejected, editing::RuleId(
"archspace.editing.wall"),
128 "ArchSpace wall create requires levelId, wallId and endpoints");
129 return planFrom(doc->makeCreateWall(*
level, *wall,
name ? *
name : *wall, archspace::
Vec2{x0, z0},
133 if (!registered.ok())
return registered;
135 registered = addCommand(
136 registry,
"archspace.opening.create.v1",
"Create ArchSpace opening",
137 [](editing::IEditableTarget&
target,
const editing::CommandRequest&
request) {
138 auto* doc = asArchSpace(
target);
139 const std::string* wall = stringField(
request.payload,
"wallId");
140 const std::string* opening = stringField(
request.payload,
"openingId");
141 const std::string* kindText = stringField(
request.payload,
"kind");
143 if (!doc || !wall || wall->empty() || !opening || opening->empty() || !kindText ||
147 return eve::editing::failed<editing::CommandPlan>(
148 editing::Status::Rejected, editing::RuleId(
"archspace.editing.opening"),
149 "ArchSpace opening requires wallId, openingId and kind");
150 auto kind = archspace::parseOpeningKind(*kindText);
152 return eve::editing::failed<editing::CommandPlan>(
153 editing::Status::Rejected, editing::RuleId(
"archspace.editing.opening"),
154 "ArchSpace opening requires wallId, openingId and kind");
155 return planFrom(doc->makeCreateOpening(*wall, *opening,
kind.value(),
t,
width,
height, sill),
156 editing::Value::Object{{
"openingId", *opening}});
158 if (!registered.ok())
return registered;
160 registered = addCommand(
161 registry,
"archspace.item.place.v1",
"Place ArchSpace item",
162 [](editing::IEditableTarget&
target,
const editing::CommandRequest&
request) {
163 auto* doc = asArchSpace(
target);
164 const std::string*
level = stringField(
request.payload,
"levelId");
165 const std::string* item = stringField(
request.payload,
"itemId");
166 const std::string* catalog = stringField(
request.payload,
"catalogId");
167 double x = 0,
y = 0,
z = 0,
yaw = 0;
168 if (!doc || !
level ||
level->empty() || !item || item->empty() || !catalog || catalog->empty() ||
171 return eve::editing::failed<editing::CommandPlan>(
172 editing::Status::Rejected, editing::RuleId(
"archspace.editing.item"),
173 "ArchSpace item place requires levelId, itemId, catalogId, x, z");
174 return planFrom(doc->makePlaceItem(*
level, *item, *catalog, archspace::Vec3{x, y, z},
yaw),
175 editing::Value::Object{{
"itemId", *item}});
177 if (!registered.ok())
return registered;
179 registered = addCommand(
180 registry,
"archspace.property.set.v1",
"Set ArchSpace property",
181 [](editing::IEditableTarget&
target,
const editing::CommandRequest&
request) {
182 auto* doc = asArchSpace(
target);
183 const std::string*
object = stringField(
request.payload,
"objectId");
184 const std::string*
path = stringField(
request.payload,
"path");
187 return eve::editing::failed<editing::CommandPlan>(
188 editing::Status::Rejected, editing::RuleId(
"archspace.editing.property"),
189 "ArchSpace property set requires objectId, path and value");
190 editing::SelectionSnapshot selection;
191 selection.channel =
"archspace";
192 selection.items.push_back({editing::SelectionDomain::Asset, doc->targetId(), editing::StableId(*
object),
193 std::string(
"archspace.node")});
194 return planFrom(doc->makeSet(selection, editing::PropertyPath(*
path), *
value,
195 editing::PropertySetMode::Absolute),
196 editing::Value::Object{{
"objectId", *object}, {
"path", *path}});
198 if (!registered.ok())
return registered;
200 return addCommand(registry,
"archspace.node.delete.v1",
"Delete ArchSpace node",
201 [](editing::IEditableTarget&
target,
const editing::CommandRequest&
request) {
202 auto* doc = asArchSpace(
target);
203 const std::string*
id = stringField(
request.payload,
"id");
204 if (!doc || !
id ||
id->empty())
205 return eve::editing::failed<editing::CommandPlan>(
206 editing::Status::Rejected, editing::RuleId(
"archspace.editing.delete"),
207 "ArchSpace delete requires id");
208 return planFrom(doc->makeDeleteNode(editing::ObjectId(*
id)),
209 editing::Value::Object{{
"id", *id}});