ifc-expressions
Version:
Parsing and evaluation of IFC expressions
67 lines (66 loc) • 4.21 kB
JavaScript
import { Func } from "../Func.js";
import { FuncArg } from "../FuncArg.js";
import { ExprEvalFunctionEvaluationObjectNotFoundErrorObj, ExprEvalMissingRequiredFunctionArgumentErrorObj, ExprEvalStatus, ExprEvalSuccessObj, ExprEvalTypeErrorObj, } from "../../ExprEvalResult.js";
import { ObjectAccessorValue } from "../../../value/ObjectAccessorValue.js";
import { ExprKind } from "../../ExprKind.js";
import { FuncArgObjectAccessor } from "../arg/FuncArgObjectAccessor.js";
import { isIfcElementAccessor } from "../../../context/IfcElementAccessor.js";
import { StringValue } from "../../../value/StringValue.js";
import { isIfcPropertyAccessor, } from "../../../context/IfcPropertyAccessor.js";
import { isIfcTypeObjectAccessor } from "../../../context/IfcTypeObjectAccessor.js";
import { isNullish } from "../../../util/IfcExpressionUtils.js";
import { Type, Types } from "../../../type/Types.js";
export class PROPERTYSET extends Func {
constructor() {
super("PROPERTYSET", [
new FuncArgObjectAccessor(true, PROPERTYSET.KEY_OBJECT_REF, Types.or(Type.IFC_ELEMENT_REF, Type.IFC_PROPERTY_REF, Type.IFC_TYPE_OBJECT_REF)),
new FuncArg(false, PROPERTYSET.KEY_PSET_NAME),
]);
}
getReturnType(argumentTypes) {
return Type.IFC_PROPERTY_SET_REF;
}
calculateResult(callingExpr, evaluatedArguments) {
const objectRef = evaluatedArguments
.get(PROPERTYSET.KEY_OBJECT_REF)
.getValue();
if (isIfcElementAccessor(objectRef)) {
const psetNameVal = evaluatedArguments.get(PROPERTYSET.KEY_PSET_NAME);
if (typeof psetNameVal === undefined) {
return new ExprEvalMissingRequiredFunctionArgumentErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Name is required to access a property set of an IFC element", this.getName(), PROPERTYSET.KEY_PSET_NAME, 1, callingExpr.getTextSpan());
}
if (!StringValue.isStringValueType(psetNameVal)) {
return new ExprEvalTypeErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Property set name must be a string", psetNameVal, callingExpr.getTextSpan());
}
const psetName = psetNameVal.stringValue;
const resultingObjectAccessor = objectRef.getIfcPropertySetAccessor(psetName);
return this.makeResult(callingExpr, resultingObjectAccessor, psetName);
}
else if (isIfcPropertyAccessor(objectRef)) {
return this.makeResult(callingExpr, objectRef.getIfcPropertySetAccessor(), "[PropertySet of Property]");
}
else if (isIfcTypeObjectAccessor(objectRef)) {
const psetNameVal = evaluatedArguments.get(PROPERTYSET.KEY_PSET_NAME);
if (typeof psetNameVal === undefined) {
return new ExprEvalMissingRequiredFunctionArgumentErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Name is required to access a property set of an IFC type object", this.getName(), PROPERTYSET.KEY_PSET_NAME, 1, callingExpr.getTextSpan());
}
if (!StringValue.isStringValueType(psetNameVal)) {
return new ExprEvalTypeErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Property set name must be a string", psetNameVal, callingExpr.getTextSpan());
}
const psetName = psetNameVal.stringValue;
return this.makeResult(callingExpr, objectRef.getIfcPropertySetAccessor(psetName), psetName);
}
return new ExprEvalTypeErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Cannot evaluate function 'propertySet' on the specified object", objectRef, callingExpr.getTextSpan());
}
makeResult(callingExpr, resultingObjectAccessor, psetName) {
if (isNullish(resultingObjectAccessor)) {
return new ExprEvalFunctionEvaluationObjectNotFoundErrorObj(ExprKind.FUNCTION, ExprEvalStatus.IFC_PROPERTY_SET_NOT_FOUND, `No ifc property set found with name '${psetName}'`, this.getName(), psetName, callingExpr.getTextSpan());
}
else {
return new ExprEvalSuccessObj(ObjectAccessorValue.of(resultingObjectAccessor));
}
}
}
PROPERTYSET.KEY_OBJECT_REF = "objectRef";
PROPERTYSET.KEY_PSET_NAME = "pset_name";
//# sourceMappingURL=PROPERTYSET.js.map