/// <summary> /// This method is used by a <see cref="Hatch"/> object to calculate its contents. It generates a /// set of parallel lines according to <see cref="LineDistance"/> and <see cref="LineAngle"/> /// and clips them with the given shape. The lines are projected into the 3D world /// by the given plane. <seealso cref="CompoundShape.Clip"/> /// </summary> /// <param name="shape">shape of the hatch object</param> /// <param name="plane">local plane of the hatch object</param> /// <returns></returns> public override GeoObjectList GenerateContent(CompoundShape shape, Plane plane) { GeoObjectList res = new GeoObjectList(); if (shape == null) { return(res); } if (marginOffset != 0.0) { shape.Approximate(false, Settings.GlobalSettings.GetDoubleValue("Approximate.Precision", 0.01)); shape = shape.Shrink(marginOffset); } for (int i = 0; i < Math.Max(1, number); ++i) { double a = lineAngle.Radian + i * (double)offset; ModOp2D m = ModOp2D.Rotate(new SweepAngle(-a)); BoundingRect ext = shape.GetExtent(); ext.Modify(m); // ext ist jetzt waagrecht, u.U. zu groß, was aber egal ist m = ModOp2D.Rotate(new SweepAngle(a)); // die umgekehrte ModOp int alt = 0; // eine Linie soll durch die Mitte gehen double c = (ext.Bottom + ext.Top) / 2.0; double num = Math.Ceiling((c - ext.Bottom) / lineDistance); ext.Bottom = c - num * lineDistance; // das untere Ende sowei nach unten verschoben, dass eine Linie durch die mitte geht // das ist wichtig, weil sonst manche Schraffuren nicht zu picken sind, da keine Linie darin erscheint // da eine Schraffur meist nur aus einem SimpleShape besteht, gibt es immer eine Linie durch die Mitte for (double y = ext.Bottom; y < ext.Top; y += lineDistance) { GeoPoint2D startPoint = m * new GeoPoint2D(ext.Left, y); GeoPoint2D endPoint = m * new GeoPoint2D(ext.Right, y); Line2D l = new Line2D(startPoint, endPoint); if (alternate && ((alt & 0x01) != 0)) { l.Reverse(); } double[] seg = shape.Clip(l, true); for (int j = 0; j < seg.Length; j += 2) { IGeoObject go = l.Trim(seg[j], seg[j + 1]).MakeGeoObject(plane); (go as ILineWidth).LineWidth = lineWidth; (go as ILinePattern).LinePattern = linePattern; (go as IColorDef).ColorDef = colorDef; res.Add(go); } ++alt; } } return(res); }