Question

Merging multiple solids?


Badge

In order to merge (union) multiple solids generated from one single input, I searched on the internet for a solution and found an idea of using the Sampler transformer (with Sampling Rate = 1 and Sampling Type = First N Features) + the CSGBuilder, in a custom transformer with a loop (merging loop), but the Sampler does not work correctly in a recursive loop (features are not sampled in a loop), so the loop become infinite!..

If there is any idea to deal with that issue, I will appreaciate it.


18 replies

Badge +2

Hi @evaniko ; have you looked at the SolidDissolver from the Hub?

Badge

Hi @evaniko ; have you looked at the SolidDissolver from the Hub?

Hi, Thanks for the reply! but that transformer doesn't work for me, and neither it rejects!

Userlevel 2
Badge +17

Hi, Thanks for the reply! but that transformer doesn't work for me, and neither it rejects!

Hi @evaniko, I looked at the implementation of the SolidDissolver, and found that it doesn't work for some solid types. Could you check the type (IFME***) of your solids with the Feature Information pane of FME Data Inspector?

Badge

Hi @evaniko, I looked at the implementation of the SolidDissolver, and found that it doesn't work for some solid types. Could you check the type (IFME***) of your solids with the Feature Information pane of FME Data Inspector?

Hi takashi, the informations that the inspector displaye are : fme_geometry = fme_aggregate and fme_type = fme_solid.

But if we use the GeometryCoercer transformer to convert the solids to an other geometry type :

- For the bref_solid destination : it says "Cannot coerce from IFMEBRepSolid to fme_brep_solid".

- For the other destination type (fme_multi, fme_aggregate, fme_line,..) : it says "Cannot coerce from IFMEExtrusion to fme_***"

Userlevel 2
Badge +17

Hi @evaniko, it seems that there are solids belonging to the IFMEBrepSolid class in your source data, and the SolidDissolver doesn't support solids of the class. However, I think you can edit the implementation of the transformer so that it can treat IFMEBrepSolid. It's simple.

  1. Add the transformer to your workspace and open its definition by right-click > Edit.
  2. Find the GeometryCoercer transformer, and connect its Untouched port to the following Aggregator.

That's it.

The GeometryCoercer (Geometry Type: fme_brep_solid) routes the input feature to the Untouched port if it was originally an IFMEBrepSolid geometry.

Note: The GeometryCoercer cannot coerce a MultiSolid feature or a homogeneous Aggregate feature consisting of solids to fme_brep_solid. If your source feature could be a MultiSolid or an Aggregate, consider decomposing them into individual solid features with the Deaggregator before inputting them to the SolidDissolver.

Badge

Thanks for the reply, I tried your manipulation without any succes, in my case the GeometryCoercer doesn't route any input feature to the Untouched port, but it indicates that the problem is in the Clip part with a warning : "SolidDissolver_Clipper_Raster(RasterClippingFactory): No valid clipper feature(s) received"..

Userlevel 2
Badge +17

Thanks for the reply, I tried your manipulation without any succes, in my case the GeometryCoercer doesn't route any input feature to the Untouched port, but it indicates that the problem is in the Clip part with a warning : "SolidDissolver_Clipper_Raster(RasterClippingFactory): No valid clipper feature(s) received"..

Sounds strange. When you sent the solids to the GeometryCoercer, it said "Cannot coerce from IFMEBRepSolid to fme_brep_solid". I therfore supposed your source solids are originally IFMEBrepSolid features.

However, if you use the SolidDissolver, all the solids can be coerced to fme_brep_solid with the internal GeometryCoercer, but the aggregate of them will be rejected by the Clipper.

It's necessary to investigate the geometry data structure in more detail. Could you post screenshots of Feature Information pane of Data Inspector for [1] a typical source solid feature and [2] the feature output from the Aggregator within the SolidDissolver?

The section of geometry type i.e. IFME*** is most important. e.g.

Badge

Sounds strange. When you sent the solids to the GeometryCoercer, it said "Cannot coerce from IFMEBRepSolid to fme_brep_solid". I therfore supposed your source solids are originally IFMEBrepSolid features.

However, if you use the SolidDissolver, all the solids can be coerced to fme_brep_solid with the internal GeometryCoercer, but the aggregate of them will be rejected by the Clipper.

It's necessary to investigate the geometry data structure in more detail. Could you post screenshots of Feature Information pane of Data Inspector for [1] a typical source solid feature and [2] the feature output from the Aggregator within the SolidDissolver?

The section of geometry type i.e. IFME*** is most important. e.g.

Here they are :

Userlevel 2
Badge +17

Here they are :

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

Badge

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

Yes! I see that it works for less than 300 features only! not more than that number! I think that the SolidDissolver is quite limited, can't we use a loop of Sampler + CSGBuilder (custom transformer) as I mentioned in the beginning to avoid the clipping task? I believe that it will be more practical no?

Badge +2

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

@takashi I did not follow all the thread, just a question to you... is the SolidDissolver in a custom transformer?

Userlevel 2
Badge +17

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

Hi @gisinnovationsb, yes the SolidDissolver is a custom transformer from the FME Hub. We have discussed about the availability of the transformer for @evaniko's question.

Badge +2

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

What I menat is ... is the The SolidDissolver in this example used "Inside" a custom transformer?

Userlevel 2
Badge +17

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

No, I tried just using the SolidDissolver. Not created a custom transformer wrapping it.

Badge +2

hmm, I think it should work theoretically...

Does it work if you reduced the number of input solids?

There is a bug when using is within a custom transformer pending update, so this is no the issue.

Userlevel 2
Badge +17

Here they are :

Hi @evaniko, do all of the 10000+ solids overlap each other and do you need to merge them to create a single complex solid? Or, the solids can be grouped to create small sets?

If you can create small sets (the number of solids in each set is less than 300), I think that the SolidDissolver can be used for each set.

Badge

Yes, the solids overlap each other and are adjascent too, so I will need to merge them in one single solid.

Badge

Hi @evaniko, it seems that there are solids belonging to the IFMEBrepSolid class in your source data, and the SolidDissolver doesn't support solids of the class. However, I think you can edit the implementation of the transformer so that it can treat IFMEBrepSolid. It's simple.

  1. Add the transformer to your workspace and open its definition by right-click > Edit.
  2. Find the GeometryCoercer transformer, and connect its Untouched port to the following Aggregator.

That's it.

The GeometryCoercer (Geometry Type: fme_brep_solid) routes the input feature to the Untouched port if it was originally an IFMEBrepSolid geometry.

Note: The GeometryCoercer cannot coerce a MultiSolid feature or a homogeneous Aggregate feature consisting of solids to fme_brep_solid. If your source feature could be a MultiSolid or an Aggregate, consider decomposing them into individual solid features with the Deaggregator before inputting them to the SolidDissolver.

Yes, the solids overlap each other and are adjascent too, so I will need to merge them in one single solid.

Reply