Draft CubicBezCurve: Difference between revisions

From FreeCAD Documentation
(the number of points should be "3n + 1" or "3n", where n is the number of segments, for n >= 1.)
(Removed Preferences paragraph.)
 
(90 intermediate revisions by 7 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{UnfinishedDocu}}
<translate>
<translate>


<!--T:1-->
<!--T:1-->
{{Docnav
{{Docnav|[[Draft BezCurve|BezCurve]]|[[Draft_Label|Label]]|[[Draft_Module|Draft]]|IconL=Draft BezCurve.svg|IconC=Workbench_Draft.svg|IconR=Draft_Label.svg }}
|[[Draft_BSpline|BSpline]]

|[[Draft_BezCurve|BezCurve]]
|[[Draft_Workbench|Draft]]
|IconL=Draft_BSpline.svg
|IconR=Draft_BezCurve.svg
|IconC=Workbench_Draft.svg
}}


<!--T:2-->
<!--T:2-->
{{GuiCommand
{{GuiCommand
|Name=Draft CubicBezCurve
|Name=Draft CubicBezCurve
|MenuLocation=DraftingBézier tools → Cubic Bézier curve
|Workbenches=[[Draft Module|Draft]], [[Arch Module|Arch]]
|Workbenches=[[Draft_Workbench|Draft]], [[Arch_Workbench|Arch]]
|MenuLocation=DraftBezier tools → CubicBezCurve
|Version=0.19
|SeeAlso=[[Draft Wire|Draft Wire]], [[Draft BSpline|Draft BSpline]], [[Draft BezCurve|Draft BezCurve]]
|SeeAlso=[[Draft_BezCurve|Draft BezCurve]], [[Draft_BSpline|Draft BSpline]]
|Version=0.19}}
}}


==Description== <!--T:3-->
==Description== <!--T:3-->


<!--T:4-->
<!--T:4-->
The [[Image:Draft_CubicBezCurve.svg|24px]] '''Draft CubicBezCurve''' command creates a [http://en.wikipedia.org/wiki/Bezier_curve Bézier curve] of the third degree (four points required).
The [[Draft CubicBezCurve|CubicBezCurve]] tool creates a [http://en.wikipedia.org/wiki/Bezier_curve Bezier Curve] of third degree. This is one of the most commonly used curves in computer graphics applications. This tool allows you to create a big spline made of several 3rd-degree Bezier segments, in a way that is similar to the Bezier tool in Inkscape. A general Bezier curve of any degree can be created with [[Draft BezCurve|Draft BezCurve]].

<!--T:31-->
The Bézier Curve is one of the most commonly used curves in computer graphics. This command allows you to create a continuous spline made up of several 3rd-degree Bézier segments, in a way that is similar to the Bézier tool in [https://inkscape.org/ Inkscape]. A general Bézier curve of any degree can be created with the [[Draft_BezCurve|Draft BezCurve]] command.


<!--T:5-->
<!--T:5-->
The [[Draft BezCurve|Draft BezCurve]] and the [[Draft CubicBezCurve|Draft CubicBezCurve]] tools use {{Emphasis|control points}} to define the position and curvature of the spline; on the other hand the [[Draft BSpline|Draft BSpline]] tool specifies the exact points through which the curve will go.
The [[Draft_BezCurve|Draft BezCurve]] and the Draft CubicBezCurve commands use {{Emphasis|control points}} to define the position and curvature of the spline. The [[Draft_BSpline|Draft BSpline]] command, on the other hand, specifies the {{Emphasis|exact points}} through which the curve will pass.


</translate>
</translate>
[[Image:cub_bez_curve.png|263px]]
[[File:Draft_CubicBezCurve_example.png|500px]]
<translate>
<translate>
<!--T:6-->
<!--T:6-->
{{Caption|Spline consisting of three cubic Bézier segments. The first segment is defined by four points. Subsequent segments reuse two points from the previous segment and therefore require only two additional points.}}
{{Caption|Cubic Bezier curve defined by three control points}}


==How to use== <!--T:7-->
==Usage== <!--T:7-->

<!--T:32-->
See also: [[Draft_Tray|Draft Tray]], [[Draft_Snap|Draft Snap]] and [[Draft_Constrain|Draft Constrain]].


<!--T:8-->
<!--T:8-->
# There are several ways to invoke the command:
# Press the {{Button|[[Image:Draft_CubicBezCurve.svg|16px]] [[Draft CubicBezCurve|Draft CubicBezCurve]]}} button.
#* Press the {{Button|[[Image:Draft_CubicBezCurve.svg|16px]] [[Draft_CubicBezCurve|Cubic Bézier curve]]}} button.
# Click a first point on the 3D view, and hold the mouse pointer.
#* Select the {{MenuCommand|Drafting → Bézier tools → [[Image:Draft_CubicBezCurve.svg|16px]] Cubic Bézier curve}} option from the menu.
# Drag the pointer to another point on the 3D view, and release the pointer.
# The {{MenuCommand|Cubic Bézier curve}} task panel opens. See [[#Options|Options]] for more information.
# Move the pointer to another point on the 3D view to adjust the curvature of the spline, and click and hold on the point.
# It is not possible the enter points via the task panel.
# Move the pointer to another point on the 3D view to adjust the final curvature of the spline, and then release the pointer. This creates a Bezier curve of 3rd degree, and continues drawing from the last point.
# For the following [[Mouse_navigation|Mouse Navigation Models]] a keyboard key must to be held down:
# Repeat the process of clicking, holding, dragging, and releasing to add points, and create further 3rd-degree Bezier segments.
#* If you are using [[Mouse_navigation#OpenInventor_Navigation|OpenInventor Navigation]] the {{KEY|Ctrl}} key must be held down throughout the command.
# Press {{KEY|Esc}} or the {{Button|Close}} button, to complete the edition.
#* If you are using [[Mouse_navigation#Gesture_Navigation|Gesture Navigation]] the {{KEY|Alt}} key must be held down for each click-hold-release sequence, but is also possible to keep this key held down throughout the command.
# Pick the first point in the [[3D_view|3D view]] and hold the mouse button (1), this is the first endpoint.
# Drag the pointer to another point in the [[3D_view|3D view]] and release the mouse button (2), this is the first control point.
# Move the pointer to another point in the [[3D_view|3D view]], pick this point and hold the mouse button (3), this is the second endpoint.
# Move the pointer to another point in the [[3D_view|3D view]] to adjust the final curvature of the segment and release the mouse button (4), this is the second control point.
# You now have one Bézier curve of the 3rd degree.
# Optionally repeat the process of clicking and holding (5), and dragging and releasing (6) to add more segments.
# Each subsequent segment will use the second endpoint and second control point of the previous segment as its first endpoint and first control point respectively.
# Press {{KEY|Esc}} or the {{Button|Close}} button to finish the command.


==Options== <!--T:9-->
==Options== <!--T:9-->


==Properties== <!--T:10-->
<!--T:28-->
See [[Draft_BezCurve#Options|Draft BezCurve]].


=== Data === <!--T:11-->
== Notes == <!--T:22-->


=== View === <!--T:12-->
<!--T:33-->
* A Draft CubicBezCurve can be edited with the [[Draft_Edit|Draft Edit]] command.

==Properties== <!--T:10-->

<!--T:29-->
See [[Draft_BezCurve#Properties|Draft BezCurve]].


==Scripting== <!--T:13-->
==Scripting== <!--T:13-->


<!--T:17-->
<!--T:17-->
{{Emphasis|See also:}} [[Draft API]] and [[FreeCAD Scripting Basics]].
See also: [https://freecad.github.io/SourceDoc/ Autogenerated API documentation] and [[FreeCAD_Scripting_Basics|FreeCAD Scripting Basics]].


<!--T:18-->
<!--T:18-->
See [[Draft BezCurve|Draft BezCurve]] for the general information. A cubic Bezier is created by passing the option <code>degree=3</code> to {{incode|makeBezCurve()}}.
See [[Draft_BezCurve|Draft BezCurve]] for general information. A cubic Bézier is created by passing the option <code>degree=3</code> to {{incode|makeBezCurve()}}.


<!--T:19-->
<!--T:19-->
For each cubic Bezier segment four points must be used, of which the two extreme points indicate where the spline passes through, and the two intermediate points are control points.
For each cubic Bézier segment four points must be used, of which the two extreme points indicate where the spline passes through, and the two intermediate points are control points.
* If only 3 points are given, it creates a quadratic Bezier instead, with only one control point.
* If only 3 points are given, it creates a quadratic Bézier instead, with only one control point.
* If only 2 points are given, it creates a linear Bezier, that is, a straight line.
* If only 2 points are given, it creates a linear Bézier, that is, a straight line.
* If 5 points are given, the first 4 create a cubic Bezier segment; the 4th and the 5th points are used to create a straight line.
* If 5 points are given, the first 4 create a cubic Bézier segment; the 4th and the 5th points are used to create a straight line.
* If 6 points are given, the first 4 create a cubic Bezier segment; the 4th and the other two points are used to create a quadratic Bezier segment.
* If 6 points are given, the first 4 create a cubic Bézier segment; the 4th and the other two points are used to create a quadratic Bézier segment.
* If 7 points are given, the first 4 create a cubic Bezier segment; the 4th and the other three are used to create a second cubic Bezier segment.
* If 7 points are given, the first 4 create a cubic Bézier segment; the 4th and the other three points are used to create a second cubic Bézier segment.
* In general, the last point in a group of four is shared with the following three points to create another curve.
* In general, the last point in a group of four is shared with the following three points maximum to create another Bézier segment.
* To have smooth curves, with no straight segments, the number of points should be {{incode|3n + 1}} or {{incode|3n}}, where {{incode|n}} is the number of segments, for <code>n >= 1</code>.
* To have smooth curves, with no straight segments, the number of points should be {{incode|3n + 1}} or {{incode|3n}}, where {{incode|n}} is the number of segments, for <code>n >= 1</code>.

</translate>
[[File:Draft_CubicBezCurve_API_example.png|600px]]
<translate>

<!--T:30-->
{{Caption|Examples of Bézier curves produced by using 2, 3, 4, 5, 6, 7, and 8 points. The solid lines indicate cubic Bézier segments; the other lines are quadratic or linear.}}


<!--T:20-->
<!--T:20-->
Example:
Example:

</translate>
</translate>
{{Code|code=
{{Code|code=
import FreeCAD as App
import FreeCAD as App
import Draft
import Draft

doc = App.newDocument()


p1 = App.Vector(-3500, 0, 0)
p1 = App.Vector(-3500, 0, 0)
Line 84: Line 122:
rot = App.Rotation()
rot = App.Rotation()


c1 = Draft.makeCircle(100, placement=App.Placement(p1, rot), face=False)
c1 = Draft.make_circle(100, placement=App.Placement(p1, rot), face=False)
c1.Label = "B1_E1"
c1.Label = "B1_E1"
c2 = Draft.makeCircle(50, placement=App.Placement(p2, rot), face=True)
c2 = Draft.make_circle(50, placement=App.Placement(p2, rot), face=True)
c2.Label = "B1_c1"
c2.Label = "B1_c1"
c3 = Draft.makeCircle(50, placement=App.Placement(p3, rot), face=True)
c3 = Draft.make_circle(50, placement=App.Placement(p3, rot), face=True)
c3.Label = "B1_c2"
c3.Label = "B1_c2"
c4 = Draft.makeCircle(100, placement=App.Placement(p4, rot), face=False)
c4 = Draft.make_circle(100, placement=App.Placement(p4, rot), face=False)
c4.Label = "B1_E2"
c4.Label = "B1_E2"
c5 = Draft.makeCircle(50, placement=App.Placement(p5, rot), face=True)
c5 = Draft.make_circle(50, placement=App.Placement(p5, rot), face=True)
c5.Label = "B2_c3"
c5.Label = "B2_c3"
c6 = Draft.makeCircle(50, placement=App.Placement(p6, rot), face=True)
c6 = Draft.make_circle(50, placement=App.Placement(p6, rot), face=True)
c6.Label = "B2_c4"
c6.Label = "B2_c4"
c7 = Draft.makeCircle(100, placement=App.Placement(p7, rot), face=False)
c7 = Draft.make_circle(100, placement=App.Placement(p7, rot), face=False)
c7.Label = "B2_E3"
c7.Label = "B2_E3"
c8 = Draft.makeCircle(50, placement=App.Placement(p8, rot), face=True)
c8 = Draft.make_circle(50, placement=App.Placement(p8, rot), face=True)
c8.Label = "B3_c5"
c8.Label = "B3_c5"
App.ActiveDocument.recompute()


doc.recompute()
B1 = Draft.makeBezCurve([p1, p2], degree=3)

B1 = Draft.make_bezcurve([p1, p2], degree=3)
B1.Label = "B_lin"
B1.Label = "B_lin"
B1.ViewObject.DrawStyle = "Dashed"
B1.ViewObject.DrawStyle = "Dashed"


B2 = Draft.makeBezCurve([p1, p2, p3], degree=3)
B2 = Draft.make_bezcurve([p1, p2, p3], degree=3)
B2.Label = "B_quad"
B2.Label = "B_quad"
B2.ViewObject.DrawStyle = "Dotted"
B2.ViewObject.DrawStyle = "Dotted"


B3 = Draft.makeBezCurve([p1, p2, p3, p4], degree=3)
B3 = Draft.make_bezcurve([p1, p2, p3, p4], degree=3)
B3.Label = "B_cub"
B3.Label = "B_cub"
B3.ViewObject.LineWidth = 4
B3.ViewObject.LineWidth = 4


B4 = Draft.makeBezCurve([p1, p2, p3, p4, p5], degree=3)
B4 = Draft.make_bezcurve([p1, p2, p3, p4, p5], degree=3)
B4.Label = "B_cub+lin"
B4.Label = "B_cub+lin"
B4.ViewObject.DrawStyle = "Dashed"
B4.ViewObject.DrawStyle = "Dashed"


B5 = Draft.makeBezCurve([p1, p2, p3, p4, p5, p6], degree=3)
B5 = Draft.make_bezcurve([p1, p2, p3, p4, p5, p6], degree=3)
B5.Label = "B_cub+quad"
B5.Label = "B_cub+quad"
B5.ViewObject.DrawStyle = "Dotted"
B5.ViewObject.DrawStyle = "Dotted"


B6 = Draft.makeBezCurve([p1, p2, p3, p4, p5, p6, p7], degree=3)
B6 = Draft.make_bezcurve([p1, p2, p3, p4, p5, p6, p7], degree=3)
B6.Label = "B_cub+cub"
B6.Label = "B_cub+cub"
B6.ViewObject.LineWidth = 2
B6.ViewObject.LineWidth = 2


B7 = Draft.makeBezCurve([p1, p2, p3, p4, p5, p6, p7, p8], degree=3)
B7 = Draft.make_bezcurve([p1, p2, p3, p4, p5, p6, p7, p8], degree=3)
B7.Label = "B_cub+cub+lin"
B7.Label = "B_cub+cub+lin"
B7.ViewObject.DrawStyle = "Dashed"
B7.ViewObject.DrawStyle = "Dashed"

App.ActiveDocument.recompute()
doc.recompute()
}}
}}
<translate>
<translate>
<!--T:14-->
{{Docnav|[[Draft BezCurve|BezCurve]]|[[Draft_Label|Label]]|[[Draft_Module|Draft]]|IconL=Draft BezCurve.svg|IconC=Workbench_Draft.svg|IconR=Draft_Label.svg}}


<!--T:15-->
{{Draft Tools navi}}


<!--T:16-->
<!--T:14-->
{{Docnav
{{Userdocnavi}}
|[[Draft_BSpline|BSpline]]
|[[Draft_BezCurve|BezCurve]]
|[[Draft_Workbench|Draft]]
|IconL=Draft_BSpline.svg
|IconR=Draft_BezCurve.svg
|IconC=Workbench_Draft.svg
}}


</translate>
</translate>
{{Draft Tools navi{{#translation:}}}}
{{clear}}
{{Userdocnavi{{#translation:}}}}

Latest revision as of 19:29, 7 December 2023

Draft CubicBezCurve

Menu location
Drafting → Bézier tools → Cubic Bézier curve
Workbenches
Draft, Arch
Default shortcut
None
Introduced in version
0.19
See also
Draft BezCurve, Draft BSpline

Description

The Draft CubicBezCurve command creates a Bézier curve of the third degree (four points required).

The Bézier Curve is one of the most commonly used curves in computer graphics. This command allows you to create a continuous spline made up of several 3rd-degree Bézier segments, in a way that is similar to the Bézier tool in Inkscape. A general Bézier curve of any degree can be created with the Draft BezCurve command.

The Draft BezCurve and the Draft CubicBezCurve commands use control points to define the position and curvature of the spline. The Draft BSpline command, on the other hand, specifies the exact points through which the curve will pass.

Spline consisting of three cubic Bézier segments. The first segment is defined by four points. Subsequent segments reuse two points from the previous segment and therefore require only two additional points.

Usage

See also: Draft Tray, Draft Snap and Draft Constrain.

  1. There are several ways to invoke the command:
    • Press the Cubic Bézier curve button.
    • Select the Drafting → Bézier tools → Cubic Bézier curve option from the menu.
  2. The Cubic Bézier curve task panel opens. See Options for more information.
  3. It is not possible the enter points via the task panel.
  4. For the following Mouse Navigation Models a keyboard key must to be held down:
    • If you are using OpenInventor Navigation the Ctrl key must be held down throughout the command.
    • If you are using Gesture Navigation the Alt key must be held down for each click-hold-release sequence, but is also possible to keep this key held down throughout the command.
  5. Pick the first point in the 3D view and hold the mouse button (1), this is the first endpoint.
  6. Drag the pointer to another point in the 3D view and release the mouse button (2), this is the first control point.
  7. Move the pointer to another point in the 3D view, pick this point and hold the mouse button (3), this is the second endpoint.
  8. Move the pointer to another point in the 3D view to adjust the final curvature of the segment and release the mouse button (4), this is the second control point.
  9. You now have one Bézier curve of the 3rd degree.
  10. Optionally repeat the process of clicking and holding (5), and dragging and releasing (6) to add more segments.
  11. Each subsequent segment will use the second endpoint and second control point of the previous segment as its first endpoint and first control point respectively.
  12. Press Esc or the Close button to finish the command.

Options

See Draft BezCurve.

Notes

  • A Draft CubicBezCurve can be edited with the Draft Edit command.

Properties

See Draft BezCurve.

Scripting

See also: Autogenerated API documentation and FreeCAD Scripting Basics.

See Draft BezCurve for general information. A cubic Bézier is created by passing the option degree=3 to makeBezCurve().

For each cubic Bézier segment four points must be used, of which the two extreme points indicate where the spline passes through, and the two intermediate points are control points.

  • If only 3 points are given, it creates a quadratic Bézier instead, with only one control point.
  • If only 2 points are given, it creates a linear Bézier, that is, a straight line.
  • If 5 points are given, the first 4 create a cubic Bézier segment; the 4th and the 5th points are used to create a straight line.
  • If 6 points are given, the first 4 create a cubic Bézier segment; the 4th and the other two points are used to create a quadratic Bézier segment.
  • If 7 points are given, the first 4 create a cubic Bézier segment; the 4th and the other three points are used to create a second cubic Bézier segment.
  • In general, the last point in a group of four is shared with the following three points maximum to create another Bézier segment.
  • To have smooth curves, with no straight segments, the number of points should be 3n + 1 or 3n, where n is the number of segments, for n >= 1.

Examples of Bézier curves produced by using 2, 3, 4, 5, 6, 7, and 8 points. The solid lines indicate cubic Bézier segments; the other lines are quadratic or linear.

Example:

import FreeCAD as App
import Draft

doc = App.newDocument()

p1 = App.Vector(-3500, 0, 0)
p2 = App.Vector(-3000, 2000, 0)
p3 = App.Vector(-1100, 2000, 0)
p4 = App.Vector(0, 0, 0)

p5 = App.Vector(1500, -2000, 0)
p6 = App.Vector(3000, -1500, 0)
p7 = App.Vector(5000, 0, 0)
p8 = App.Vector(6000, 1500, 0)
rot = App.Rotation()

c1 = Draft.make_circle(100, placement=App.Placement(p1, rot), face=False)
c1.Label = "B1_E1"
c2 = Draft.make_circle(50, placement=App.Placement(p2, rot), face=True)
c2.Label = "B1_c1"
c3 = Draft.make_circle(50, placement=App.Placement(p3, rot), face=True)
c3.Label = "B1_c2"
c4 = Draft.make_circle(100, placement=App.Placement(p4, rot), face=False)
c4.Label = "B1_E2"
c5 = Draft.make_circle(50, placement=App.Placement(p5, rot), face=True)
c5.Label = "B2_c3"
c6 = Draft.make_circle(50, placement=App.Placement(p6, rot), face=True)
c6.Label = "B2_c4"
c7 = Draft.make_circle(100, placement=App.Placement(p7, rot), face=False)
c7.Label = "B2_E3"
c8 = Draft.make_circle(50, placement=App.Placement(p8, rot), face=True)
c8.Label = "B3_c5"

doc.recompute()

B1 = Draft.make_bezcurve([p1, p2], degree=3)
B1.Label = "B_lin"
B1.ViewObject.DrawStyle = "Dashed"

B2 = Draft.make_bezcurve([p1, p2, p3], degree=3)
B2.Label = "B_quad"
B2.ViewObject.DrawStyle = "Dotted"

B3 = Draft.make_bezcurve([p1, p2, p3, p4], degree=3)
B3.Label = "B_cub"
B3.ViewObject.LineWidth = 4

B4 = Draft.make_bezcurve([p1, p2, p3, p4, p5], degree=3)
B4.Label = "B_cub+lin"
B4.ViewObject.DrawStyle = "Dashed"

B5 = Draft.make_bezcurve([p1, p2, p3, p4, p5, p6], degree=3)
B5.Label = "B_cub+quad"
B5.ViewObject.DrawStyle = "Dotted"

B6 = Draft.make_bezcurve([p1, p2, p3, p4, p5, p6, p7], degree=3)
B6.Label = "B_cub+cub"
B6.ViewObject.LineWidth = 2

B7 = Draft.make_bezcurve([p1, p2, p3, p4, p5, p6, p7, p8], degree=3)
B7.Label = "B_cub+cub+lin"
B7.ViewObject.DrawStyle = "Dashed"

doc.recompute()