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; }
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)); }