mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 06:58:56 +00:00
ifdefs around geometry handling for 4.3 rc schemas #6710
This commit is contained in:
@@ -55,8 +55,10 @@ double translate_to_length_measure(const IfcSchema::IfcCurve* crv, double param_
|
|||||||
return fabs(clothoid->ClothoidConstant()*sqrt(PI))*param_value;
|
return fabs(clothoid->ClothoidConstant()*sqrt(PI))*param_value;
|
||||||
} else if (auto circ = crv->as<IfcSchema::IfcCircle>()) {
|
} else if (auto circ = crv->as<IfcSchema::IfcCircle>()) {
|
||||||
return circ->Radius() * param_value;
|
return circ->Radius() * param_value;
|
||||||
|
#ifdef SCHEMA_HAS_IfcPolynomialCurve
|
||||||
} else if (auto poly = crv->as<IfcSchema::IfcPolynomialCurve>()) {
|
} else if (auto poly = crv->as<IfcSchema::IfcPolynomialCurve>()) {
|
||||||
return param_value;
|
return param_value;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("Unsupported curve measure type");
|
throw std::runtime_error("Unsupported curve measure type");
|
||||||
}
|
}
|
||||||
@@ -75,7 +77,9 @@ double translate_if_param_value(const IfcSchema::IfcCurve* crv, IfcSchema::IfcCu
|
|||||||
typedef boost::mpl::vector<
|
typedef boost::mpl::vector<
|
||||||
IfcSchema::IfcLine
|
IfcSchema::IfcLine
|
||||||
, IfcSchema::IfcCircle
|
, IfcSchema::IfcCircle
|
||||||
|
#ifdef SCHEMA_HAS_IfcPolynomialCurve
|
||||||
, IfcSchema::IfcPolynomialCurve
|
, IfcSchema::IfcPolynomialCurve
|
||||||
|
#endif
|
||||||
#ifdef SCHEMA_HAS_IfcClothoid
|
#ifdef SCHEMA_HAS_IfcClothoid
|
||||||
, IfcSchema::IfcClothoid
|
, IfcSchema::IfcClothoid
|
||||||
#endif
|
#endif
|
||||||
@@ -198,8 +202,12 @@ class curve_segment_evaluator {
|
|||||||
inst_(inst),
|
inst_(inst),
|
||||||
length_unit_(length_unit),
|
length_unit_(length_unit),
|
||||||
parent_curve_(inst->ParentCurve()) {
|
parent_curve_(inst->ParentCurve()) {
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_UsingCurves
|
||||||
auto composite_curves = inst->UsingCurves();
|
auto composite_curves = inst->UsingCurves();
|
||||||
|
#else
|
||||||
|
aggregate_of<IfcSchema::IfcCompositeCurve>::ptr composite_curves;
|
||||||
|
throw std::runtime_error("Schema not supported");
|
||||||
|
#endif
|
||||||
|
|
||||||
// Find the next segment after inst
|
// Find the next segment after inst
|
||||||
const IfcSchema::IfcCurveSegment* next_inst = nullptr;
|
const IfcSchema::IfcCurveSegment* next_inst = nullptr;
|
||||||
@@ -245,17 +253,23 @@ class curve_segment_evaluator {
|
|||||||
|
|
||||||
segment_type_ = is_horizontal ? ST_HORIZONTAL : is_vertical ? ST_VERTICAL : is_cant ? ST_CANT : ST_HORIZONTAL;
|
segment_type_ = is_horizontal ? ST_HORIZONTAL : is_vertical ? ST_VERTICAL : is_cant ? ST_CANT : ST_HORIZONTAL;
|
||||||
|
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_SegmentStart
|
||||||
start_ = translate_if_param_value(inst->ParentCurve(), inst->SegmentStart()) * length_unit;
|
start_ = translate_if_param_value(inst->ParentCurve(), inst->SegmentStart()) * length_unit;
|
||||||
|
#else
|
||||||
|
throw std::runtime_error("Schema not supported");
|
||||||
|
#endif
|
||||||
length_ = translate_if_param_value(inst->ParentCurve(), inst->SegmentLength()) * length_unit;
|
length_ = translate_if_param_value(inst->ParentCurve(), inst->SegmentLength()) * length_unit;
|
||||||
projected_length_ = length_; // initialize with something reasonable
|
projected_length_ = length_; // initialize with something reasonable
|
||||||
|
|
||||||
if (inst) {
|
if (inst) {
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_Placement
|
||||||
curve_segment_placement_ = taxonomy::cast<taxonomy::matrix4>(mapping_->map(inst->Placement()))->ccomponents();
|
curve_segment_placement_ = taxonomy::cast<taxonomy::matrix4>(mapping_->map(inst->Placement()))->ccomponents();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next_inst) {
|
if (next_inst) {
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_Placement
|
||||||
next_segment_placement_ = taxonomy::cast<taxonomy::matrix4>(mapping_->map(next_inst->Placement()))->ccomponents();
|
next_segment_placement_ = taxonomy::cast<taxonomy::matrix4>(mapping_->map(next_inst->Placement()))->ccomponents();
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// there is not a next segment, however IfcGradientCurve and IfcSegmentReferenceCurve have an
|
// there is not a next segment, however IfcGradientCurve and IfcSegmentReferenceCurve have an
|
||||||
// optional EndPoint which services the same purpose as the zero-length last segment.
|
// optional EndPoint which services the same purpose as the zero-length last segment.
|
||||||
@@ -264,7 +278,9 @@ class curve_segment_evaluator {
|
|||||||
auto& cc = *(composite_curves)->begin();
|
auto& cc = *(composite_curves)->begin();
|
||||||
if (segment_type_ == ST_VERTICAL) {
|
if (segment_type_ == ST_VERTICAL) {
|
||||||
auto gradient_curve = cc->as<IfcSchema::IfcGradientCurve>();
|
auto gradient_curve = cc->as<IfcSchema::IfcGradientCurve>();
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_Placement
|
||||||
end_point = gradient_curve->EndPoint();
|
end_point = gradient_curve->EndPoint();
|
||||||
|
#endif
|
||||||
} else if (segment_type_ == ST_CANT) {
|
} else if (segment_type_ == ST_CANT) {
|
||||||
auto segmented_reference_curve = cc->as<IfcSchema::IfcSegmentedReferenceCurve>();
|
auto segmented_reference_curve = cc->as<IfcSchema::IfcSegmentedReferenceCurve>();
|
||||||
end_point = segmented_reference_curve->EndPoint();
|
end_point = segmented_reference_curve->EndPoint();
|
||||||
@@ -776,8 +792,12 @@ class curve_segment_evaluator {
|
|||||||
auto A0 = c->ConstantTerm();
|
auto A0 = c->ConstantTerm();
|
||||||
auto A1 = c->LinearTerm();
|
auto A1 = c->LinearTerm();
|
||||||
auto A2 = c->QuadraticTerm();
|
auto A2 = c->QuadraticTerm();
|
||||||
auto A3 = c->CubicTerm();
|
boost::optional<double> A3, A4, A5, A6, A7;
|
||||||
boost::optional<double> A4, A5, A6, A7;
|
#ifdef SCHEMA_IfcThirdOrderPolynomialSpiral_HAS_CubicTerm
|
||||||
|
A3 = c->CubicTerm();
|
||||||
|
#else
|
||||||
|
A3 = c->QubicTerm();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (segment_type_ == ST_CANT) {
|
if (segment_type_ == ST_CANT) {
|
||||||
polynomial_cant_spiral(A0, A1, A2, A3, A4, A5, A6, A7);
|
polynomial_cant_spiral(A0, A1, A2, A3, A4, A5, A6, A7);
|
||||||
@@ -832,7 +852,10 @@ class curve_segment_evaluator {
|
|||||||
if (segment_type_ == ST_HORIZONTAL) {
|
if (segment_type_ == ST_HORIZONTAL) {
|
||||||
convert_u = [](double u) { return u; };
|
convert_u = [](double u) { return u; };
|
||||||
} else {
|
} else {
|
||||||
auto curve_segment_placement = taxonomy::cast<taxonomy::matrix4>(mapping_->map(inst_->Placement()))->ccomponents();
|
Eigen::Matrix4d curve_segment_placement;
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_Placement
|
||||||
|
curve_segment_placement = taxonomy::cast<taxonomy::matrix4>(mapping_->map(inst_->Placement()))->ccomponents();
|
||||||
|
#endif
|
||||||
auto csStartX = curve_segment_placement(0, 3);
|
auto csStartX = curve_segment_placement(0, 3);
|
||||||
auto csStartY = curve_segment_placement(1, 3);
|
auto csStartY = curve_segment_placement(1, 3);
|
||||||
auto csStartDx = curve_segment_placement(0, 0);
|
auto csStartDx = curve_segment_placement(0, 0);
|
||||||
@@ -1015,6 +1038,7 @@ class curve_segment_evaluator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SCHEMA_HAS_IfcPolynomialCurve
|
||||||
void operator()(const IfcSchema::IfcPolynomialCurve* pc) {
|
void operator()(const IfcSchema::IfcPolynomialCurve* pc) {
|
||||||
// see https://forums.buildingsmart.org/t/ifcpolynomialcurve-clarification/4716 for discussion on IfcPolynomialCurve
|
// see https://forums.buildingsmart.org/t/ifcpolynomialcurve-clarification/4716 for discussion on IfcPolynomialCurve
|
||||||
auto coeffX = pc->CoefficientsX().get_value_or(std::vector<double>());
|
auto coeffX = pc->CoefficientsX().get_value_or(std::vector<double>());
|
||||||
@@ -1159,6 +1183,7 @@ class curve_segment_evaluator {
|
|||||||
[](double /*u*/) -> Eigen::Matrix4d { return Eigen::Matrix4d::Identity(); });
|
[](double /*u*/) -> Eigen::Matrix4d { return Eigen::Matrix4d::Identity(); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid
|
|||||||
function_item_evaluator evaluator(settings_,fn);
|
function_item_evaluator evaluator(settings_,fn);
|
||||||
double start = 0;
|
double start = 0;
|
||||||
double end = fn->length();
|
double end = fn->length();
|
||||||
#ifdef SCHEMA_HAS_IfcDirectrixCurveSweptAreaSolid
|
// IfcPointByDistanceExpression is introduced in rc2, the code below doesn't work on rc1 because startparam is optional<double>
|
||||||
|
#if defined(SCHEMA_HAS_IfcDirectrixCurveSweptAreaSolid) && defined(SCHEMA_HAS_IfcPointByDistanceExpression)
|
||||||
// IfcDirectrixCurveSweptAreaSolid introduced in 4.3 changed attribute type
|
// IfcDirectrixCurveSweptAreaSolid introduced in 4.3 changed attribute type
|
||||||
// from optional IfcParamValue to optional IfcCurveMeasureSelect.
|
// from optional IfcParamValue to optional IfcCurveMeasureSelect.
|
||||||
// Invocation of mapping on pre-4.3 models can never result in a piecewise_function.
|
// Invocation of mapping on pre-4.3 models can never result in a piecewise_function.
|
||||||
|
|||||||
@@ -53,7 +53,12 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcGradientCurve* inst) {
|
|||||||
// Get starting position of gradient curve, which is relative to the base curve
|
// Get starting position of gradient curve, which is relative to the base curve
|
||||||
// The gradient curve can start before or after the start of the base curve
|
// The gradient curve can start before or after the start of the base curve
|
||||||
auto first_segment = *(segments->begin());
|
auto first_segment = *(segments->begin());
|
||||||
auto p = taxonomy::cast<taxonomy::matrix4>(map(first_segment->as<IfcSchema::IfcCurveSegment>()->Placement()));
|
taxonomy::matrix4::ptr p;
|
||||||
|
#ifdef SCHEMA_IfcCurveSegment_HAS_Placement
|
||||||
|
p = taxonomy::cast<taxonomy::matrix4>(map(first_segment->as<IfcSchema::IfcCurveSegment>()->Placement()));
|
||||||
|
#else
|
||||||
|
throw std::runtime_error("Unsupported schema");
|
||||||
|
#endif
|
||||||
const Eigen::Matrix4d& m = p->ccomponents();
|
const Eigen::Matrix4d& m = p->ccomponents();
|
||||||
double gradient_start = m(0, 3); // start of vertical (row 0, col 3) - "Distance Along" horizontal curve
|
double gradient_start = m(0, 3); // start of vertical (row 0, col 3) - "Distance Along" horizontal curve
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSectionedSolidHorizontal* in
|
|||||||
for (auto& cs : *css) {
|
for (auto& cs : *css) {
|
||||||
faces.push_back(std::move(taxonomy::cast<taxonomy::face>(map(cs))));
|
faces.push_back(std::move(taxonomy::cast<taxonomy::face>(map(cs))));
|
||||||
}
|
}
|
||||||
#ifdef SCHEMA_HAS_IfcPointByDistanceExpression
|
#if defined(SCHEMA_HAS_IfcPointByDistanceExpression) && !defined(SCHEMA_IfcSectionedSurface_HAS_FixedAxisVertical)
|
||||||
for (auto& csp : *csps) {
|
for (auto& csp : *csps) {
|
||||||
auto pbde = csp->Location()->as<IfcSchema::IfcPointByDistanceExpression>(true);
|
auto pbde = csp->Location()->as<IfcSchema::IfcPointByDistanceExpression>(true);
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,8 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSectionedSurface* inst) {
|
|||||||
for (auto& cs : *css) {
|
for (auto& cs : *css) {
|
||||||
faces.push_back(std::move(taxonomy::cast<taxonomy::geom_item>(map(cs))));
|
faces.push_back(std::move(taxonomy::cast<taxonomy::geom_item>(map(cs))));
|
||||||
}
|
}
|
||||||
#ifdef SCHEMA_HAS_IfcPointByDistanceExpression
|
// IfcSectionedSurface::FixedAxisVertical removed in rc4, where CrossSectionPositions was IfcPointByDistanceExpression instead of IfcAxis2PlacementLinear
|
||||||
|
#if defined(SCHEMA_HAS_IfcPointByDistanceExpression) && !defined(SCHEMA_IfcSectionedSurface_HAS_FixedAxisVertical)
|
||||||
for (auto& csp : *csps) {
|
for (auto& csp : *csps) {
|
||||||
auto pbde = csp->Location()->as<IfcSchema::IfcPointByDistanceExpression>(true);
|
auto pbde = csp->Location()->as<IfcSchema::IfcPointByDistanceExpression>(true);
|
||||||
|
|
||||||
|
|||||||
@@ -53,8 +53,13 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcSegmentedReferenceCurve* ins
|
|||||||
// Get starting position of cant curve, relative to the gradient curve.
|
// Get starting position of cant curve, relative to the gradient curve.
|
||||||
// The cant curve can start before or after the start of the gradient curve
|
// The cant curve can start before or after the start of the gradient curve
|
||||||
auto first_segment = *(segments->begin());
|
auto first_segment = *(segments->begin());
|
||||||
auto p = taxonomy::cast<taxonomy::matrix4>(map(first_segment->as<IfcSchema::IfcCurveSegment>()->Placement()));
|
taxonomy::matrix4::ptr p;
|
||||||
const Eigen::Matrix4d& m = p->ccomponents();
|
#ifdef SCHEMA_IfcCurveSegment_HAS_Placement
|
||||||
|
p = taxonomy::cast<taxonomy::matrix4>(map(first_segment->as<IfcSchema::IfcCurveSegment>()->Placement()));
|
||||||
|
#else
|
||||||
|
throw std::runtime_error("Unsupported schema");
|
||||||
|
#endif
|
||||||
|
const Eigen::Matrix4d& m = p->ccomponents();
|
||||||
double cant_start = m(0, 3); // start of cant curve
|
double cant_start = m(0, 3); // start of cant curve
|
||||||
|
|
||||||
auto cant = taxonomy::make<taxonomy::piecewise_function>(cant_start,spans);
|
auto cant = taxonomy::make<taxonomy::piecewise_function>(cant_start,spans);
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ ptree* descend(ifcopenshell::geometry::abstract_mapping* mapping, IfcSchema::Ifc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SCHEMA_HAS_IfcAlignmentSegment
|
#if defined(SCHEMA_HAS_IfcAlignmentSegment) && defined(SCHEMA_IfcAlignmentSegment_HAS_DesignParameters)
|
||||||
if (auto* als = product->as<IfcSchema::IfcAlignmentSegment>()) {
|
if (auto* als = product->as<IfcSchema::IfcAlignmentSegment>()) {
|
||||||
ptree node;
|
ptree node;
|
||||||
format_entity_instance(mapping, als->DesignParameters(), node, child, false);
|
format_entity_instance(mapping, als->DesignParameters(), node, child, false);
|
||||||
|
|||||||
Reference in New Issue
Block a user