| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Beispiel für Schraffur mit Insel-Freistellungen (1273 / mal gelesen)
|
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1213 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 04. Sep. 2017 14:42 <-- editieren / zitieren --> Unities abgeben:
Moin! ich suche ein Beispiel für das Erstellen einer Schraffur mit Freistellungen (Inseln). Mein Code sieht auszugweise bis jetzt so aus Code:
... Dim ObjIds As New ObjectIdCollection() ObjIds.Add(pLineIdOuter)Dim oHatch As New Hatch() acBlkTblRec.AppendEntity(oHatch) acTrans.AddNewlyCreatedDBObject(oHatch, True) Dim normal As Vector3d = Vector3d.ZAxis ErrDetail = "Create Hatch-Object - Set HatchPatterName" oHatch.SetHatchPattern(HatchPatternType.PreDefined, HatchPatternName) oHatch.Normal = normal oHatch.Elevation = 0.0 ' für Solid braucht es keine Scalierung und keinen Winkel If Not HatchPatternName.ToLower = "solid" Then ErrDetail = "Create Hatch-Object - Set PatternScale" oHatch.PatternScale = PatternScale ErrDetail = "Create Hatch-Object - Set PatternAngle" oHatch.PatternAngle = PatternAngle 'oHatch.PatternAngle = 2.0 End If ErrDetail = "Create Hatch-Object - Set HatchColor" oHatch.ColorIndex = HatchColor ErrDetail = "Create Hatch-Object - Set Associative" oHatch.Associative = HatchAssociative ' hat dieses Polygon eine Insel (Hole)? If MPolygonLineString.HolesCount > 0 Then ErrDetail = "Create a PolyLine - Inner" For j = 0 To MPolygonLineString.HolesCount - 1 Dim pLineIdInner As ObjectId pLineIdInner = DrawPolylineByMapPolygon(MPolygonLineString.GetHoleAt(j), LineTypeName, ColorIndex, LineWidth) If Not IsNothing(pLineIdInner) Then ObjIds.Add(pLineIdInner) End If Next j End If ErrDetail = "Create Hatch-Object - Append LoopOuter" oHatch.AppendLoop(HatchLoopTypes.Outermost, ObjIds) 'acTrans.AddNewlyCreatedDBObject(oHatch, True) oHatch.EvaluateHatch(True) ' optional den Border wieder löschen If CreateHatchWithoutBorder = True Then acPolyOuter.Erase(True) ...
Im oberen Teil gibt es eine Funktion DrawPolylineByMapPolygon die aus Topobase-Elementen eine Polylinie (erfolgreich) zeichnet. Auch wenn ich den Schraffurerstellungsteil auskommentiere werden meine Polylinien gezeichnet - nur mit der Schraffur und den Freistellungen klappt das nicht. Vorm Prinzip hat dieser Code bereits Schraffuren erzeugt - da wurde aber immer nur eine Umgrenzung übergeben. Die Suche nach einem Beispiel, das eine einfache Fläche mit Freistellungen erzeugt, war erfolglos. Kann mir einer von Euch weiterhelfen?? Gruß Jan
------------------ jan :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 04. Sep. 2017 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
|
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1213 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 04. Sep. 2017 15:19 <-- editieren / zitieren --> Unities abgeben:
Moin! danke - die Seite hatte ich auch schon einmal gelesen. Das Beispiel unten arbeitet über einen Auswahlpunkt und ist deshalb nicht so ganz mit einer Aufgabe übereinstimmend. Ich habe mir auch den oberen Block durchgelesen und danach wird das äußere Polygon mit HatchLoopTypes.Outermost definiert und die innenliegenden werden mit HatchLoopTypes.Default. Hier war ich vielleicht etwas auf der falschen Färte, weil in dem funktionierenden Weg ich HatchLoopTypes.Default auch für das alleinige Polygon erfolgreich verwendet habe. Nun habe ich den Code an diesen Text etwas angepasst. Code:
Dim ObjIdsOuter As New ObjectIdCollection() Dim ObjIdsInner As New ObjectIdCollection() ObjIdsOuter.Add(pLineIdOuter) ... ' hat dieses Polygon eine Insel (Hole)? If MPolygonLineString.HolesCount > 0 Then ErrDetail = "Create a PolyLine - Inner" For j = 0 To MPolygonLineString.HolesCount - 1 Dim pLineIdInner As ObjectId pLineIdInner = DrawPolylineByMapPolygon(MPolygonLineString.GetHoleAt(j), LineTypeName, ColorIndex, LineWidth) If Not IsNothing(pLineIdInner) Then ObjIdsInner.Add(pLineIdInner) End If Next j End IfErrDetail = "Create Hatch-Object - Append LoopOuter" oHatch.AppendLoop(HatchLoopTypes.Outermost, ObjIdsOuter) ErrDetail = "Create Hatch-Object - Append LoopInner" oHatch.AppendLoop(HatchLoopTypes.Default, ObjIdsInner) ...
Aber weiterhin kommt eine Fehlermeldung
Zitat:
Autodesk.AutoCAD.Runtime.Exception: eInvalidInput bei Autodesk.AutoCAD.DatabaseServices.Hatch.AppendLoop(HatchLoopTypes loopType, ObjectIdCollection dbObjIds) bei EBL.MapService.Acad.DrawTBMultiPolygon_Work(Int64 PolyFID, Document TbDoc, Boolean CreateHatch, String LineTypeName, Double LineScale, Int32 ColorIndex, Double LineWidth, Int32 HatchColor, String HatchPatternName, Boolean HatchAssociative, Double PatternScale, Double PatternAngle, Boolean CreateHatchWithoutBorder) in C:\VSProjects\FDO_MPolygon\EBL.MapService\EBL.MapService\cls_Acad.vb:Zeile 541.
541 ist die Zeile mit der Zuweisung der innenliegenden Objekte
Code: oHatch.AppendLoop(HatchLoopTypes.Default, ObjIdsInner)
????? Gruß Jan ------------------ jan :-)
[Diese Nachricht wurde von tappenbeck am 04. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1213 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 05. Sep. 2017 08:43 <-- editieren / zitieren --> Unities abgeben:
Moin! Lösung gefunden! Code: If ObjIdsInner.Count > 0 Then oHatch.AppendLoop(HatchLoopTypes.Default, ObjIdsInner)
Wenn innen nichts ist, dann kann man auch keine Inseln erzeugen. .-) Gruß Jan ------------------ jan :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|