Macro EdgesToArc/cs: Difference between revisions
(Created page with "Makro EdgesToArc (Hrany do oblouku)") |
No edit summary |
||
(21 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
⚫ | |||
{{Macro|Icon=Text-x-python|Name=EdgesToArc|Description=Replaces the selected Edges by a circular Arc if possible. Useful for restoring discretized arcs.|Author=Jreinhardt}} |
|||
<div class="mw-translate-fuzzy"> |
|||
{{Macro/cs |
|||
|Name=EdgesToArc |
|||
|Icon=Macro_EdgesToArc.png |
|||
|Translate=EdgesToArc |
|||
|Description=Pokud je to možné nahradí vybrané hrany kružnicovým obloukem. Užitečné pro obnovu oblouků rozpadlých do krátkých přímek. |
|||
|Author=Jreinhardt |
|||
|Version=1.0 |
|||
|Date=2014-01-02 |
|||
|SeeAlso=[[Macro_SuperWire/cs|Macro SuperWire]] |
|||
}} |
|||
</div> |
|||
==Description== |
|||
Občas někdo narazí na drát (lomenou čáru), který je obsažen v oblouku vytvořeném z malých přímých segmentů. Často se to stává při práci se soubory z jiných programů. Toto makro umožňuje relativně snadno konvertovat takový oblouk složený z přímek zpět do kružnicového oblouku. Snižuje to velikost souboru a soubor to dělá mnohem snadněji zpracovatelným, |
|||
<div class="mw-translate-fuzzy"> |
|||
Pro použití tohoto makra musíte rozlámat drát do jednotlivých hran použitím funkce {{KEY|[[Image:Draft Downgrade.png|16px]] [[Draft Downgrade]]}}. Potom jen vyberete segmenty, které chcete nahradit kružnicovým obloukem a spustíte makro. Potřebujete minimálně 2 segmenty. |
|||
</div> |
|||
Makro zkontroluje jestli segmenty leží na obecné kružnici a pokud ne, samo se ukončí. Jinak vytvoří oblouk a odstraní segmenty. |
|||
<div class="mw-translate-fuzzy"> |
|||
Sometimes one encounters wires that contain arcs that are made up of small straight segments. This often happens when working with files from other programs. This macro makes it relatively easy to convert these discretized arcs back to circular arcs. This reduces the file size and makes the file more manageable. |
|||
Kvůli malým nepřesnostem ve výpočtu, může funkce {{KEY|[[Image:Draft Upgrade.png|16px]] [[Draft Upgrade]]}} někdy skončit chybně a vrátit oblouk zpět do drátu. V takovém případě poskytne lepší výsledek mnohem robustnější makro [[Macro_SuperWire]]. |
|||
</div> |
|||
==Script== |
|||
To use this macro, you have to break down the wire into individual edges using the {{KEY|[[Image:Draft Downgrade.png|16px]] [[Draft Downgrade]]}} function. Then just select the segments that you want to replace by an circular arc and execute the macro. You need at least two segments. |
|||
ToolBar Icon [[Image:Macro_EdgesToArc.png]] |
|||
The macro will check whether the segments all lie on a common circle and will abort if this is not the case. Otherwise it will create the arc and remove the segments. |
|||
'''Macro_EdgesToArc.FCMacro''' |
|||
Because of small inaccuracies in the calculations, the {{KEY|[[Image:Draft Upgrade.png|16px]] [[Draft Upgrade]]}} function can sometimes fail to recombine the other edges and the arcs back into a wire. In this case the [[Macro_SuperWire]] provides a more robust way to do this. |
|||
{{MacroCode|code= |
|||
<syntaxhighlight> |
|||
import Draft |
import Draft |
||
import FreeCADGui, FreeCAD |
import FreeCADGui, FreeCAD |
||
Line 74: | Line 97: | ||
for shape in sel: |
for shape in sel: |
||
FreeCAD.ActiveDocument.removeObject(shape.Name) |
FreeCAD.ActiveDocument.removeObject(shape.Name) |
||
}} |
|||
</syntaxhighlight> |
|||
{{clear}} |
{{clear}} |
||
⚫ |
Latest revision as of 21:07, 4 November 2021
Popis |
---|
Pokud je to možné nahradí vybrané hrany kružnicovým obloukem. Užitečné pro obnovu oblouků rozpadlých do krátkých přímek. Version macro : 1.0 Date last modification : 2014-01-02 Autor: Jreinhardt |
Autor |
Jreinhardt |
Download |
None |
Odkazy |
Makro recepty| Jak nainstalovat makra Jak přizpůsobit panely nástrojů |
Verze |
1.0 |
Datum poslední úpravy |
2014-01-02 |
Verze FreeCAD |
None |
Výchozí zástupce |
None |
Viz též |
Macro SuperWire |
Description
Občas někdo narazí na drát (lomenou čáru), který je obsažen v oblouku vytvořeném z malých přímých segmentů. Často se to stává při práci se soubory z jiných programů. Toto makro umožňuje relativně snadno konvertovat takový oblouk složený z přímek zpět do kružnicového oblouku. Snižuje to velikost souboru a soubor to dělá mnohem snadněji zpracovatelným,
Pro použití tohoto makra musíte rozlámat drát do jednotlivých hran použitím funkce Draft Downgrade. Potom jen vyberete segmenty, které chcete nahradit kružnicovým obloukem a spustíte makro. Potřebujete minimálně 2 segmenty.
Makro zkontroluje jestli segmenty leží na obecné kružnici a pokud ne, samo se ukončí. Jinak vytvoří oblouk a odstraní segmenty.
Kvůli malým nepřesnostem ve výpočtu, může funkce Draft Upgrade někdy skončit chybně a vrátit oblouk zpět do drátu. V takovém případě poskytne lepší výsledek mnohem robustnější makro Macro_SuperWire.
Script
Macro_EdgesToArc.FCMacro
import Draft import FreeCADGui, FreeCAD from FreeCAD import Base, Console from math import atan2, pi, fabs #This macro replaces a number of edges approximating a circular arc by a proper circular arc. #It might be necessary to use the superwire macro to recombine the edges back to a wire, because of small errors in the calculations. sel = FreeCADGui.Selection.getSelection() if len(sel) < 2: Console.PrintError("Too few edges are selected\n") edges = [s.Shape for s in sel] start_vertices = [] end_vertices = [] for edge in edges: start_vertices.append(edge.Vertexes[0].Point) end_vertices.append(edge.Vertexes[1].Point) vertices = start_vertices + end_vertices start,end,middle = None,None,None #find start and end points for edge in edges: is_start = True is_end = True for point in end_vertices: if edge.Vertexes[0].Point.distanceToPoint(point) < 1e-8: is_start = False for point in start_vertices: if edge.Vertexes[1].Point.distanceToPoint(point) < 1e-8: is_end = False if is_start: start = edge.Vertexes[0].Point if is_end: end = edge.Vertexes[1].Point #find middle point, at least not too far away from the middle for v in vertices: ratio = v.distanceToPoint(start)/v.distanceToPoint(end) if ratio > 0.5 and ratio < 2.: middle = v break if middle is None: Console.PrintError("Could not find suitable middle point\n") arc = Part.ArcOfCircle(start,middle,end) #Check circularity circular = True for v in vertices: if fabs(v.distanceToPoint(arc.Center) - arc.Radius) > 1e-6: Console.PrintError("Edges do not approximate a circular arc\n") circular = False break if circular: Part.show(arc.toShape()) for shape in sel: FreeCAD.ActiveDocument.removeObject(shape.Name)