This page collects common issues users encounter when using Solidean, along with hints on how to resolve them.
Installation & Build
Most installation and build issues stem from missing dynamic libraries, incorrect include paths, or misconfigured build scripts.
Below are the most common cases and their resolutions.
Solidean library (.dll / .so) cannot be found
Cause:
The dynamic library is not in the expected search path.
Resolution:
- Place the
solidean.dll(Windows) orlibsolidean.so(Linux) in the same directory as your executable - Alternatively, add the library folder to the system library path (e.g.
PATHon Windows,LD_LIBRARY_PATHon Linux) - For Python, the same rule applies: the
.dll/.somust be in a location Python can load
CMake cannot find Solidean
Cause:
The Solidean CMakeLists was not added to your build.
Resolution:
- Use the provided CMakeLists from the SDK, e.g.
lang/cpp17/CMakeLists.txt - Add it to your project via:
add_subdirectory(path/to/solidean/lang/cpp17) target_link_libraries(my_target PRIVATE Solidean::Cpp17) - This links against the dynamic library and makes #include
<solidean.hh>available
Python import fails: ModuleNotFoundError: No module named 'solidean'
Cause:
solidean.py is not in a place where Python can resolve imports.
Resolution:
- Ensure
solidean.pyis on yourPYTHONPATHor inside your working directory - Verify that the
.dll/.sois also discoverable by Python (see above)
Linking errors in C or C++ (non-CMake)
Cause:
The dynamic library or headers were not added correctly.
Resolution:
- Include
solidean.hhdirectly - Link against the Solidean dynamic library (
.dll/.so) manually in your build system - No official demos exist for non-CMake, but setup is minimal: one header + one dynamic library
Namespace or symbol not found
Cause:
Solidean symbols are scoped under the correct namespace but may be referenced incorrectly.
Resolution:
- For C++: use
solidean::Context(or the relevant namespace for your API version) - For Python: use
solidean.Context
Technical
My Boolean result is empty or missing parts
Symptoms:
Union,Difference, orIntersectionreturns an empty mesh- Result mesh is unexpectedly missing surfaces
Causes:
- Input meshes were not declared with the correct
MeshType - Supersolid assumptions violated (holes, self-intersections, nested components)
- Winding order inconsistencies
Resolution:
- Double-check the input
MeshType. If the mesh may have intersections or nesting, useSupersolid. - Run
Operation::Healon non-supersolid meshes before Boolean operations. - For inconsistent winding, flip all input face orientations to ensure consistent solids.
- Inspect
ExecuteResultfromContext::Execute, e.g.InputIsNotSolid,InputIsNotSupersolid.
My operation fails with OperandMustBeSupersolid
Cause:
A mesh declared as NonSupersolid was passed to an operation that requires at least Supersolid.
Resolution:
Run the mesh through Operation::Heal to upgrade it to a valid supersolid, then retry the operation.
If a strictly solid mesh is required, combine with Operation::SelfUnion.
My mesh looks correct but ExecuteResult reports an error
Cause:
Solidean continues execution in best-effort mode even when issues are detected (e.g. InputHasSelfIntersections).
The resulting mesh may be usable but flagged as potentially invalid.
Resolution:
- Treat warnings as indicators that your input guarantees were not respected.
- Fix inputs by setting appropriate flags in
SurfaceBuilder/MeshBuilder. - Use
Operation::Healif the input cannot be guaranteed supersolid.
Exported meshes look fragmented or over-triangulated
Cause:
- Using unrolled triangle export (
ExportFormat::Triangles) loses connectivity - ExportOptions not configured to preserve polygon structure
Resolution:
- Prefer
ExportFormat::IndexedTrianglesorExportFormat::IndexedPolygonsto deduplicate vertices - Use
ExportOption::Manifoldto enforce consistent topology - Use
ExportOption::RemoveSpuriousVerticesto remove redundant tessellation
I cannot access data from a TypedBlob
Symptoms:
TypedBlob::GetDatareturns nothing or fails withResult::DataSlotNotFound
Causes:
- Requested
DataSlotnot populated due to missingExportOption - Operation not executed yet
Resolution:
- Verify you set the right
ExportOption(e.g.VertexPositionF32,PrimitiveID). - Ensure you called
Context::Executebefore accessing blob data. - Use
TypedBlob::HasDatato check which slots are actually present.
Error: OperandFromWrongOperation
Cause:
A MeshOperand created in one operation was used in a different operation.
Resolution:
If you need to reuse a mesh result across operations, first call Operation::Output to materialize it, then Operation::Input in the new operation.
Error: OperationNotYetExecuted
Cause:
Attempting to access the result of an operation (mesh or blob) before Context::Execute was called.
Resolution:
Ensure Context::Execute(op) is invoked and completes before you read results.
Error: IncompatibleArithmetics
Cause:
Meshes defined with different ExactArithmetic kernels were combined in one operation.
Resolution:
All inputs to a single operation must use the same arithmetic kernel.
Re-import or rebuild meshes under a consistent ExactArithmetic.
My queries (area, volume, etc.) return strange values
Cause:
- Query results are accumulated in double precision, not exact arithmetic
- Supersolid interpretation double-counts overlapping regions
Resolution:
- If precise volume/surface semantics are required, ensure you run
SelfUnionbefore queries - Accept small floating-point accumulation errors as documented
- Contact support if strict error bounds are critical to your application
Performance is unexpectedly slow
Possible reasons:
- Flags like
AllowSelfIntersectionsorAllowSurfaceIntersectionsintroduce heavy checks ExecutionMode::Debugenabled, adding validation overhead
Resolution:
- Only enable intersection/nesting flags when strictly needed
- Use
Multithreadedexecution (default) - If performance issues persist, please contact support - we are continuously improving performance across a wide range of use cases
Licensing
Licensing issues are handled during Context::Create.
If the context fails to initialize, check the returned Result code for the specific error.
Error: Result::LicenseInvalid
Cause:
The license key is not valid for this installation or has been mistyped.
Resolution:
- Double-check that the correct license key is being used (is currently baked into the shared library)
- Contact support if the license was recently issued but is still rejected
Error: Result::LicenseNoNetwork
Cause:
License verification requires a network connection, but none was available.
Resolution:
- Ensure the machine can reach the licensing server (check firewall / proxy settings)
- Retry when a stable connection is available
- Contact support if offline activation is required
Error: Result::LicenseMustActivateMachine
Cause:
This license requires explicit machine activation.
Resolution:
- Run the activation process provided with your license details (this should be handled automatically)
- Contact support if you need to transfer or reset machine activations
Error: Result::LicenseOutOfMachines / Result::LicenseOutOfCores / Result::LicenseOutOfProcesses
Cause:
The license limits the number of machines, cores, or processes, and those limits have been exceeded.
Resolution:
- Verify you are running within the licensed limits
- Contact support if you need to extend or adjust limits for your use case
Error: Result::LicenseExpired / Result::LicenseOverdue / Result::LicenseSuspended
Cause:
The license is no longer active (expired, overdue, or temporarily suspended).
Resolution:
- Renew or update your license
- Contact support if you believe the license should still be active
Error: Result::LicenseBanned
Cause:
The license was explicitly banned (e.g. due to violation of terms).
Resolution:
- Contact support for clarification and possible remediation