Ejemplo n.º 1
0
 public CreateAnnoMasksEngine(CreateAnnoMasks config, IProcessingContext context,
                              IProcessingFeedback feedback)
     : base(config.Name, context, feedback)
 {
     _inputDataset      = OpenRequiredDataset(config.InputDataset, nameof(config.InputDataset));
     _outputMaskDataset = OpenRequiredDataset(config.OutputMaskDataset, nameof(config.OutputMaskDataset));
     _relationshipClass = OpenAssociation(config.OutputAssociation);
     _maskAttributes    = ProcessingUtils.CreateFieldSetter(
         config.MaskAttributes, _outputMaskDataset.FeatureClass, nameof(config.MaskAttributes));
     _maskMargin                = ImplicitValue.Create(config.MaskMargin, nameof(config.MaskMargin));
     _maskMargin.Environment    = new StandardEnvironment().RegisterConversionFunctions();
     _simplificationToleranceMu = config.SimplificationTolerance;                 // TODO convert mm to mu
     _maskOutlineType           = config.MaskOutlineType;
     _fillHoles = config.FillHoles;
 }
Ejemplo n.º 2
0
            private Geometry CreateMask(Feature feature, double simplTol, double margin, MaskOutlineType type, bool fillHoles)
            {
                var oid         = feature.GetObjectID();
                var outlineType = type == MaskOutlineType.BoundingBox
                                                          ? OutlineType.BoundingBox
                                                          : OutlineType.Exact;

                var result = _inputDataset.Symbology.QueryDrawingOutline(oid, outlineType);

                if (simplTol > 0)
                {
                    const bool removeDegenerateParts = true;
                    const bool preserveCurves        = true;
                    result = GeometryEngine.Instance.Generalize(
                        result, simplTol, removeDegenerateParts, preserveCurves);
                }

                switch (type)
                {
                case MaskOutlineType.BoundingBox:
                case MaskOutlineType.Exact:
                    // nothing to do
                    break;

                case MaskOutlineType.ExactSimplified:
                    var        maxDeviation          = Math.Max(simplTol, margin / 20.0);
                    const bool removeDegenerateParts = true;
                    const bool preserveCurves        = true;
                    result = GeometryEngine.Instance.Generalize(
                        result, maxDeviation, removeDegenerateParts, preserveCurves);
                    break;

                case MaskOutlineType.ConvexHull:
                    result = ConvexHull(result);
                    break;
                }

                if (margin > 0 || margin < 0)
                {
                    if (result.HasCurves())
                    {
                        result = GeometryEngine.Instance.DensifyByDeviation(result, margin / 10.0);
                    }

                    result = GeometryEngine.Instance.Buffer(result, margin);
                }

                if (fillHoles)
                {
                    throw new NotImplementedException("FillHoles is not yet implemented, sorry");                     // TODO
                }

                return(GeometryEngine.Instance.SimplifyAsFeature(result));
            }