Tangentiale Übergänge

Wie können Übergänge zwischen zwei Freiformflächen aussehen? Neben der harten Kante sind auch weiche Übergänge möglich.

*Skript (3.88 KiB, 1y ago, 195 downloads) *

2017/05/19 22:55

Farbige Darstellung von Werten

Für einen objektabhängigen Wert soll seine Abweichung von einem Wunschwert angezeigt werden. Im konkreten Beispiel geht es um die Länge einer Kurve (BSpline). Wird die Kurve bei der Bearbeitung zu lang, soll sie sich rot färben, wird sie zu kurz, soll sie blau werden.

Die einfachste Lösung ist ein Part::FeaturePython Objekt, welches die Kurve als Parameter verwendet und bei jeder Veränderung der Kurve deren Länge berechnet und mit den Vorgaben vergleicht.

spline = Draft.makeBSpline(points,closed=False,face=True,support=None)

a=FreeCAD.activeDocument().addObject("Part::FeaturePython","MyMonitor")
m=Monitor(a)

a.source=spline
a.minVal= spline.Shape.Length*0.95
a.maxVal= spline.Shape.Length*1.05

Die Monitor-Klasse erledigt die Überwachungs- und Färbearbeit. Sie ist im Skript enthalten.

Bei Abweichungen über die Genzen hinaus wird die Kurve neu gefärbt. Das erledigt die execute-Methode.

def execute(proxy,obj):
	mm=20
	if obj.source <> None:
			print ("Value and interval:", round(obj.source.Shape.Edge1.Length,1),obj.minVal,obj.maxVal)
			obj.source.ViewObject.LineColor=(1.0,1.0,1.0)
			if obj.source.Shape.Edge1.Length<obj.minVal:
				obj.source.ViewObject.LineColor=(0.0,.0,1.0)
			elif obj.source.Shape.Edge1.Length>obj.minVal and obj.source.Shape.Edge1.Length<obj.minVal+mm:
				j=1-(obj.minVal+mm-obj.source.Shape.Edge1.Length)/mm
				j=j*0.5
				obj.source.ViewObject.LineColor=(j,j,1.0)
			elif obj.source.Shape.Edge1.Length<obj.maxVal and obj.source.Shape.Edge1.Length>obj.maxVal-mm:
				j=(obj.maxVal-obj.source.Shape.Edge1.Length)/mm
				j=j*0.5
				obj.source.ViewObject.LineColor=(1.0,j,j)
			elif obj.source.Shape.Edge1.Length>obj.maxVal:
				obj.source.ViewObject.LineColor=(1.0,0.0,.0)

  • Skript (3.56 KiB, 1y ago, 198 downloads)
2017/04/24 23:50

How to create a Driver Sketch

Using Expressions it is possible to create and use a simplified sketch to drive a more complex sketch The idea is to map the blue constraints of the driver to some red constraints in the driven sketch.

The driver is created as a hexagon (red)

The driven sketch is a shoe rib sketch from the Nurbs Workbench project (yellow).

import nurbswb
import nurbswb.createshoerib
nurbswb.createshoerib.run()

The mapping between the constraints is donme by related name lists

inputs=[ 
		'x0','y0',
		'x1','y1',
		'x2','y2',
		'x3','y3',
		'x4','y4',
		'x5','y5'
	]

outputs=[ 
		'p0X', 'p0Y',  
		'p2X', 'p2Y',
		'p4X', 'p4Y',
		'p8X', 'p8Y',
		'p12X', 'p12Y',
		'p14X', 'p14Y',
	]

The expression can be done by script this way

rc=target.setExpression('Constraints.'+outputs[i], source.Name+".Constraints."+inputs[i])

2017/04/18 20:04

Zerlegen eines Körpers mitPython

Das Design eines Trichter-Modells im CAD ist eine Aufgabe, die sich dem Skript auf die Eingabe der Hauptmaße reduziert.

Will oder kann man den Trichter nicht als ein ganzes Teil fertigen, z. B. als 3D Druck oder Guss, wird man ihn aus vier zugeschnittenen und abgeschrägten Platten herstellen.

Um aus dem Gesamtmodell die Platten mit den pasenden Gehrungswinkeln zu bekommen, schneidet man den Trichtern an den Kanten in vier Teile. die Koordinaten der Schnittlinien bzw. lassen sich aus dem Modell auslesen.

Auf jede Ecke eines Modells wird über

meinModell.Shape.Vertexes[i]

zugegriffen.

Dabei durchläuft i die Zahlen 0 bis Anzahl der Ecken minus 1. Welche Ecke wo liegt, bekommt man beim Selektieren von Ecken heraus. Wählt man eine Ecke aus, so erscheint in der Selektionsansicht ein Eintrag wie

Unbenannt.Trichter.Vertex8(Trichter)

Man kann sich aber auch alle Ecken mi ihren Nummern im 3D Modell anzeigen lassen, indem bei jeder Ecke ein Textobjekt eingefügt wird.

import Draft

def zeigeEckNummern(obj):

	vxs=obj.Shape.Vertexes
	for i,v in  enumerate(vxs):
		t=Draft.makeText(["   "+str(i+1)],point=v.Point)
		t.ViewObject.DisplayMode = "Screen"
		t.ViewObject.FontSize=15
		App.ActiveDocument.ActiveObject.ViewObject.TextColor=(1.0,1.0,0.0)
		Draft.makePoint(v.Point)
		App.ActiveDocument.ActiveObject.Label="Vex " +str(i+1)
		

		App.ActiveDocument.ActiveObject.ViewObject.PointSize=6
		App.ActiveDocument.ActiveObject.ViewObject.PointColor=(1.0,1.0,0.0)
		App.ActiveDocument.ActiveObject.Label="Label " +str(i+1)


zeigeEckNummern(App.ActiveDocument.Trichter)

Die interne Nummerierung der Ecken, Kanten und Flächen unterscheidet sich von der Anzeige um eins, deshalb wird bei der Ausgabe str(i+1) statt str(i) verwendet.

Für den Trichter lassen sich die einzelnen Wände aus je 8 Ecken zusammensetzen.

Alle Teile sind gradlinig begrenzt und das Part-Modul iefert die Methoden zum Erzeugen der Kantenzüge (Polygone) und Flächen(Face).

Für die vier Seiten sind die jeweiligen Eckennummern und die Seiten zu bestimmen. Da der Trichter-Generator immer auf die gleiche Weise arbeitet, muss diese Arbeit auch nur einmal getan werden.

vxs=App.ActiveDocument.Trichter.Shape.Vertexes

seiten=[
	[[4,3,1,2],[1,2,9,10],[9,10,14,16],[14,16,4,3],[3,1,10,14],[4,2,9,16]],
	[[2,5,12,4],[12,4,16,15],[16,15,8,9],[8,9,2,5],[2,4,16,9],[5,12,15,8]],
	[[7,10,1,6],[1,6,11,3],[11,3,14,13],[14,13,7,10],[1,3,14,10],[6,11,13,7]],
	[[7,8,5,6],[5,6,11,12],[11,12,15,13],[15,13,7,8],[8,5,12,15],[6,11,13,7]]
]


for fls in seiten:
	faces=[]
	for fl in fls:
		pts=[vxs[v-1].Point for v in fl]
		fa=Part.Face(Part.makePolygon(pts,True))
		faces.append(fa)

	Part.show(Part.makeSolid(Part.makeShell(faces)))
	App.ActiveDocument.ActiveObject.ViewObject.Transparency=60

Die erzeugten Seitenteile sind in dieser Form (noch) nicht funktional vom Trichter abhängig. Bei Änderung des Parameter des Trichters passt sich dessen Form automatisch an. Die Teile müssen aber durch einen erneuten Aufruf des Skripts erzeugt werden.

2017/03/22 11:26

Paralleles Editieren von Daten

Möchte man mehrere Kurven gleichzeitig bearbeiten, kann man für jedes Objekt einen eigenen Bearbeitsdialog erstellen. Diese Dialoge können dann auf der arbeitsfläche verteilt werden.

Im Beispiel werden Beschränkungen in Skizzen für die Gewichte der Pole von Splines durch Schieberegler verändert.

Das Verfahren lässt sich auch auf andere skalare Größen wie etwa die Lage der Knoten anwenden. Auf diesem Weg bekommt man schnell den Zugriff auf die volle Formen-Vielfalt der NURBS und die Datenmenge lässt sich noch überschaubar anordnen.

Der Vorteil gegenüber eines Ansatzes mit einem Spreadsheet: Es werden nur die Datenreihen angezeigt, die aktuell wirklich gebraucht werden. Und die Daten stehen in der Nähe ihres Wirkungskreises.

Skript (1.54 KiB, 1y ago, 198 downloads)

2017/03/15 14:06

Ältere Einträge >>

Archiv

Blog-Archiv

2016-01: 3 Einträge 2016-02: 4 Einträge 2016-03: 2 Einträge 2016-05: 2 Einträge 2016-08: 3 Einträge 2016-09: 8 Einträge 2016-10: 7 Einträge 2016-11: 11 Einträge 2016-12: 3 Einträge

2016

Dezember

November

Oktober

September

August

Mai

März

Februar

Januar

Blog-Archiv

2015-01: 13 Einträge 2015-02: 9 Einträge 2015-03: 5 Einträge 2015-04: 7 Einträge 2015-05: 1 Eintrag 2015-07: 6 Einträge 2015-08: 1 Eintrag 2015-09: 2 Einträge 2015-10: 5 Einträge 2015-11: 7 Einträge 2015-12: 7 Einträge

2015

Dezember

November

Oktober

September

August

Juli

Mai

April

März

Februar

Januar

Blog-Archiv

2014-02: 1 Eintrag 2014-03: 3 Einträge 2014-04: 6 Einträge 2014-05: 2 Einträge 2014-07: 1 Eintrag 2014-09: 14 Einträge 2014-10: 23 Einträge 2014-11: 13 Einträge 2014-12: 9 Einträge

2014

Dezember

November

Oktober

September

Juli

Mai

April

März

Februar

blog.txt · Zuletzt geändert: 2017/03/12 13:12 von freek