mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 05:00:53 +00:00
layerset-first setting
This commit is contained in:
@@ -255,6 +255,8 @@ int main(int argc, char** argv) {
|
|||||||
("enable-layerset-slicing",
|
("enable-layerset-slicing",
|
||||||
"Specifies whether to enable the slicing of products according "
|
"Specifies whether to enable the slicing of products according "
|
||||||
"to their associated IfcMaterialLayerSet.")
|
"to their associated IfcMaterialLayerSet.")
|
||||||
|
("layerset-first", "Assigns the first layer material of the layerset "
|
||||||
|
"to the complete product.")
|
||||||
("include", po::value<inclusion_filter>(&include_filter)->multitoken(),
|
("include", po::value<inclusion_filter>(&include_filter)->multitoken(),
|
||||||
"Specifies that the entities that match a specific filtering criteria are to be included in the geometrical output:\n"
|
"Specifies that the entities that match a specific filtering criteria are to be included in the geometrical output:\n"
|
||||||
"1) 'entities': the following list of types should be included. SVG output defaults "
|
"1) 'entities': the following list of types should be included. SVG output defaults "
|
||||||
@@ -390,6 +392,7 @@ int main(int argc, char** argv) {
|
|||||||
const bool include_plan = vmap.count("plan") != 0;
|
const bool include_plan = vmap.count("plan") != 0;
|
||||||
const bool include_model = vmap.count("model") != 0 || (!include_plan);
|
const bool include_model = vmap.count("model") != 0 || (!include_plan);
|
||||||
const bool enable_layerset_slicing = vmap.count("enable-layerset-slicing") != 0;
|
const bool enable_layerset_slicing = vmap.count("enable-layerset-slicing") != 0;
|
||||||
|
const bool layerset_first = vmap.count("layerset-first") != 0;
|
||||||
const bool use_element_names = vmap.count("use-element-names") != 0;
|
const bool use_element_names = vmap.count("use-element-names") != 0;
|
||||||
const bool use_element_guids = vmap.count("use-element-guids") != 0;
|
const bool use_element_guids = vmap.count("use-element-guids") != 0;
|
||||||
const bool use_material_names = vmap.count("use-material-names") != 0;
|
const bool use_material_names = vmap.count("use-material-names") != 0;
|
||||||
@@ -603,6 +606,7 @@ int main(int argc, char** argv) {
|
|||||||
settings.set(IfcGeom::IteratorSettings::INCLUDE_CURVES, include_plan);
|
settings.set(IfcGeom::IteratorSettings::INCLUDE_CURVES, include_plan);
|
||||||
settings.set(IfcGeom::IteratorSettings::EXCLUDE_SOLIDS_AND_SURFACES, !include_model);
|
settings.set(IfcGeom::IteratorSettings::EXCLUDE_SOLIDS_AND_SURFACES, !include_model);
|
||||||
settings.set(IfcGeom::IteratorSettings::APPLY_LAYERSETS, enable_layerset_slicing);
|
settings.set(IfcGeom::IteratorSettings::APPLY_LAYERSETS, enable_layerset_slicing);
|
||||||
|
settings.set(IfcGeom::IteratorSettings::LAYERSET_FIRST, layerset_first);
|
||||||
settings.set(IfcGeom::IteratorSettings::NO_NORMALS, no_normals);
|
settings.set(IfcGeom::IteratorSettings::NO_NORMALS, no_normals);
|
||||||
settings.set(IfcGeom::IteratorSettings::GENERATE_UVS, generate_uvs);
|
settings.set(IfcGeom::IteratorSettings::GENERATE_UVS, generate_uvs);
|
||||||
settings.set(IfcGeom::IteratorSettings::SEARCH_FLOOR, use_element_hierarchy);
|
settings.set(IfcGeom::IteratorSettings::SEARCH_FLOOR, use_element_hierarchy);
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ private:
|
|||||||
double ifc_planeangle_unit;
|
double ifc_planeangle_unit;
|
||||||
double modelling_precision;
|
double modelling_precision;
|
||||||
double dimensionality;
|
double dimensionality;
|
||||||
|
double layerset_first;
|
||||||
|
|
||||||
#ifndef NO_CACHE
|
#ifndef NO_CACHE
|
||||||
Cache cache;
|
Cache cache;
|
||||||
@@ -146,7 +147,7 @@ public:
|
|||||||
setValue(GV_PLANEANGLE_UNIT, other.getValue(GV_PLANEANGLE_UNIT));
|
setValue(GV_PLANEANGLE_UNIT, other.getValue(GV_PLANEANGLE_UNIT));
|
||||||
setValue(GV_PRECISION, other.getValue(GV_PRECISION));
|
setValue(GV_PRECISION, other.getValue(GV_PRECISION));
|
||||||
setValue(GV_DIMENSIONALITY, other.getValue(GV_DIMENSIONALITY));
|
setValue(GV_DIMENSIONALITY, other.getValue(GV_DIMENSIONALITY));
|
||||||
setValue(GV_DEFLECTION_TOLERANCE, other.getValue(GV_DEFLECTION_TOLERANCE));
|
setValue(GV_LAYERSET_FIRST, other.getValue(GV_LAYERSET_FIRST));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +182,8 @@ public:
|
|||||||
// Default: 0.00001 (obtained from IfcGeometricRepresentationContext if available)
|
// Default: 0.00001 (obtained from IfcGeometricRepresentationContext if available)
|
||||||
GV_PRECISION,
|
GV_PRECISION,
|
||||||
// Whether to process shapes of type Face or higher (1) Wire or lower (-1) or all (0)
|
// Whether to process shapes of type Face or higher (1) Wire or lower (-1) or all (0)
|
||||||
GV_DIMENSIONALITY
|
GV_DIMENSIONALITY,
|
||||||
|
GV_LAYERSET_FIRST
|
||||||
};
|
};
|
||||||
|
|
||||||
bool convert_wire_to_face(const TopoDS_Wire& wire, TopoDS_Face& face);
|
bool convert_wire_to_face(const TopoDS_Wire& wire, TopoDS_Face& face);
|
||||||
|
|||||||
@@ -1084,6 +1084,9 @@ void IfcGeom::Kernel::setValue(GeomValue var, double value) {
|
|||||||
case GV_DIMENSIONALITY:
|
case GV_DIMENSIONALITY:
|
||||||
dimensionality = value;
|
dimensionality = value;
|
||||||
break;
|
break;
|
||||||
|
case GV_LAYERSET_FIRST:
|
||||||
|
layerset_first = value;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(!"never reach here");
|
assert(!"never reach here");
|
||||||
}
|
}
|
||||||
@@ -1115,6 +1118,9 @@ double IfcGeom::Kernel::getValue(GeomValue var) const {
|
|||||||
case GV_DIMENSIONALITY:
|
case GV_DIMENSIONALITY:
|
||||||
return dimensionality;
|
return dimensionality;
|
||||||
break;
|
break;
|
||||||
|
case GV_LAYERSET_FIRST:
|
||||||
|
return layerset_first;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
assert(!"never reach here");
|
assert(!"never reach here");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1422,7 +1428,7 @@ const IfcSchema::IfcMaterial* IfcGeom::Kernel::get_single_material_association(c
|
|||||||
// the first material (in accordance with other viewers) when layerset-slicing is disabled.
|
// the first material (in accordance with other viewers) when layerset-slicing is disabled.
|
||||||
if (!single_material && associated_material->as<IfcSchema::IfcMaterialLayerSetUsage>()) {
|
if (!single_material && associated_material->as<IfcSchema::IfcMaterialLayerSetUsage>()) {
|
||||||
IfcSchema::IfcMaterialLayerSet* layerset = associated_material->as<IfcSchema::IfcMaterialLayerSetUsage>()->ForLayerSet();
|
IfcSchema::IfcMaterialLayerSet* layerset = associated_material->as<IfcSchema::IfcMaterialLayerSetUsage>()->ForLayerSet();
|
||||||
if (layerset->MaterialLayers()->size() >= 1) {
|
if (getValue(GV_LAYERSET_FIRST) > 0.0 ? layerset->MaterialLayers()->size() >= 1 : layerset->MaterialLayers()->size() == 1) {
|
||||||
IfcSchema::IfcMaterialLayer* layer = (*layerset->MaterialLayers()->begin());
|
IfcSchema::IfcMaterialLayer* layer = (*layerset->MaterialLayers()->begin());
|
||||||
if (layer->hasMaterial()) {
|
if (layer->hasMaterial()) {
|
||||||
single_material = layer->Material();
|
single_material = layer->Material();
|
||||||
|
|||||||
@@ -712,6 +712,12 @@ namespace IfcGeom {
|
|||||||
kernel.setValue(IfcGeom::Kernel::GV_MAX_FACES_TO_SEW, settings.get(IteratorSettings::SEW_SHELLS) ? 1000 : -1);
|
kernel.setValue(IfcGeom::Kernel::GV_MAX_FACES_TO_SEW, settings.get(IteratorSettings::SEW_SHELLS) ? 1000 : -1);
|
||||||
kernel.setValue(IfcGeom::Kernel::GV_DIMENSIONALITY, (settings.get(IteratorSettings::INCLUDE_CURVES)
|
kernel.setValue(IfcGeom::Kernel::GV_DIMENSIONALITY, (settings.get(IteratorSettings::INCLUDE_CURVES)
|
||||||
? (settings.get(IteratorSettings::EXCLUDE_SOLIDS_AND_SURFACES) ? -1. : 0.) : +1.));
|
? (settings.get(IteratorSettings::EXCLUDE_SOLIDS_AND_SURFACES) ? -1. : 0.) : +1.));
|
||||||
|
kernel.setValue(IfcGeom::Kernel::GV_LAYERSET_FIRST,
|
||||||
|
settings.get(IteratorSettings::LAYERSET_FIRST)
|
||||||
|
? +1.0
|
||||||
|
: -1.0
|
||||||
|
);
|
||||||
|
|
||||||
if (settings.get(IteratorSettings::BUILDING_LOCAL_PLACEMENT)) {
|
if (settings.get(IteratorSettings::BUILDING_LOCAL_PLACEMENT)) {
|
||||||
if (settings.get(IteratorSettings::SITE_LOCAL_PLACEMENT)) {
|
if (settings.get(IteratorSettings::SITE_LOCAL_PLACEMENT)) {
|
||||||
Logger::Message(Logger::LOG_WARNING, "building-local-placement takes precedence over site-local-placement");
|
Logger::Message(Logger::LOG_WARNING, "building-local-placement takes precedence over site-local-placement");
|
||||||
|
|||||||
@@ -84,8 +84,10 @@ namespace IfcGeom
|
|||||||
SITE_LOCAL_PLACEMENT = 1 << 15,
|
SITE_LOCAL_PLACEMENT = 1 << 15,
|
||||||
///
|
///
|
||||||
BUILDING_LOCAL_PLACEMENT = 1 << 16,
|
BUILDING_LOCAL_PLACEMENT = 1 << 16,
|
||||||
|
/// Assigns the first layer material to the entire product
|
||||||
|
LAYERSET_FIRST = 1 << 17,
|
||||||
/// Number of different setting flags.
|
/// Number of different setting flags.
|
||||||
NUM_SETTINGS = 16
|
NUM_SETTINGS = 17
|
||||||
};
|
};
|
||||||
/// Used to store logical OR combination of setting flags.
|
/// Used to store logical OR combination of setting flags.
|
||||||
typedef unsigned SettingField;
|
typedef unsigned SettingField;
|
||||||
|
|||||||
@@ -301,6 +301,12 @@ struct ShapeRTTI : public boost::static_visitor<PyObject*>
|
|||||||
IfcGeom::Kernel kernel;
|
IfcGeom::Kernel kernel;
|
||||||
kernel.setValue(IfcGeom::Kernel::GV_MAX_FACES_TO_SEW, settings.get(IfcGeom::IteratorSettings::SEW_SHELLS) ? 1000 : -1);
|
kernel.setValue(IfcGeom::Kernel::GV_MAX_FACES_TO_SEW, settings.get(IfcGeom::IteratorSettings::SEW_SHELLS) ? 1000 : -1);
|
||||||
kernel.setValue(IfcGeom::Kernel::GV_DIMENSIONALITY, (settings.get(IfcGeom::IteratorSettings::INCLUDE_CURVES) ? (settings.get(IfcGeom::IteratorSettings::EXCLUDE_SOLIDS_AND_SURFACES) ? -1. : 0.) : +1.));
|
kernel.setValue(IfcGeom::Kernel::GV_DIMENSIONALITY, (settings.get(IfcGeom::IteratorSettings::INCLUDE_CURVES) ? (settings.get(IfcGeom::IteratorSettings::EXCLUDE_SOLIDS_AND_SURFACES) ? -1. : 0.) : +1.));
|
||||||
|
kernel.setValue(IfcGeom::Kernel::GV_LAYERSET_FIRST,
|
||||||
|
settings.get(IteratorSettings::LAYERSET_FIRST)
|
||||||
|
? +1.0
|
||||||
|
: -1.0
|
||||||
|
);
|
||||||
|
|
||||||
std::pair<std::string, double> length_unit = kernel.initializeUnits(project->UnitsInContext());
|
std::pair<std::string, double> length_unit = kernel.initializeUnits(project->UnitsInContext());
|
||||||
|
|
||||||
if (instance->is(IfcSchema::Type::IfcProduct)) {
|
if (instance->is(IfcSchema::Type::IfcProduct)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user