Draft CubicBezCurve: Difference between revisions

From FreeCAD Documentation
(Code example)
No edit summary
(25 intermediate revisions by 4 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 BezCurve|BezCurve]]

|[[Draft_Label|Label]]
|[[Draft_Module|Draft]]
|IconL=Draft BezCurve.svg
|IconC=Workbench_Draft.svg
|IconR=Draft_Label.svg
}}


<!--T:2-->
<!--T:2-->
{{GuiCommand
{{GuiCommand
|Name=Draft CubicBezCurve
|Name=Draft CubicBezCurve
|Workbenches=[[Draft Module|Draft]], [[Arch Module|Arch]]
|MenuLocation=Draft → Bezier tools → CubicBezCurve
|MenuLocation=Draft → Bezier tools → CubicBezCurve
|Workbenches=[[Draft Module|Draft]], [[Arch Module|Arch]]
|Version=0.19
|SeeAlso=[[Draft Wire|Draft Wire]], [[Draft BSpline|Draft BSpline]], [[Draft BezCurve|Draft BezCurve]]
|SeeAlso=[[Draft Wire|Draft Wire]], [[Draft BSpline|Draft BSpline]], [[Draft BezCurve|Draft BezCurve]]
}}
|Version=0.19}}


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


<!--T:4-->
<!--T:4-->
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 Bezier curves. 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 Bezier curve of any degree can be created with [[Draft BezCurve|Draft BezCurve]].
The {{Button|[[Image:Draft_CubicBezCurve.svg|16px]] [[Draft CubicBezCurve|Draft CubicBezCurve]]}} tool creates a [http://en.wikipedia.org/wiki/Bezier_curve Bezier Curve] of third degree (four points required). 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:5-->
<!--T:5-->
The [[Draft BezCurve|Draft BezCurve]] and the [[Draft CubicBezCurve|Draft CubicBezCurve]] tools use {{Emphasis|control points}} to define the direction of the curve; 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|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.


</translate>
</translate>
[[Image:cub_bez_curve.png|263px]]
[[File:Draft_CubicBezCurve_example.png|600px]]
<translate>
<translate>

<!--T:6-->
<!--T:6-->
{{Caption|Spline defined by three cubic Bezier segments. Each cubic Bezier is defined by four points, but when the tool is used graphically, only three such points are placed: 1-2-3 for the first segment, 3-4-5 for the second segment, and 5-6-7 for the third segment; the fourth point in each segment is defined implicitly; the last point 8 is necessary to finish the operation, and would be part of a fourth Bezier segment if the operation is continued.}}
{{Caption|Cubic Bezier curve defined by three control points}}


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


<!--T:8-->
<!--T:8-->
# Press the {{Button|[[Image:Draft_CubicBezCurve.svg|16px]] [[Draft CubicBezCurve|Draft CubicBezCurve]]}} button.
# Press the {{Button|[[Image:Draft_CubicBezCurve.svg|16px]] [[Draft CubicBezCurve|Draft CubicBezCurve]]}} button.
# Click a first point on the 3D view, and hold the mouse pointer.
# Click a first point on the 3D view, and hold the mouse button (1); this is the first end point.
# Drag the pointer to another point on the 3D view, and release the pointer.
# Drag the pointer to another point on the 3D view, and release the mouse button (2); this is the first control point.
# Move the pointer to another point on the 3D view to adjust the curvature of the spline, and click and hold on the point.
# Move the pointer to another point on the 3D view, and click and hold the mouse button on this point (3); this is the second end point.
# 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.
# Move the pointer to another point on the 3D view to adjust the final curvature of the spline, and then release the mouse button (4).
# Repeat the process of clicking, holding, dragging, and releasing to add points, and create further 3rd-degree Bezier segments.
# At this moment you already have one Bezier curve of 3rd degree. The command can be completed by pressing {{KEY|Esc}} or the {{Button|Close}} button, or you may repeat the process of clicking and holding (5), and dragging and releasing (6) to add more 3rd-degree Bezier segments.

# Press {{KEY|Esc}} or the {{Button|Close}} button, to complete the edition.
<!--T:21-->
Note that with this workflow you need two click-hold-release sequences to create a single Bezier curve of third degree.
* The first click-hold defines the first end point.
* The first release defines the first control point.
* The second click-hold defines the second end point, and the general direction of the spline.
* The second release defines the final curvature of the spline.
* The second control point is not explicitly given, but is determined from the location of the pointer during the second release.

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

=== Creating several Bezier segments === <!--T:23-->
* The second release also correspond to the first control point of the subsequent Bezier curve.
* This means that the second click-hold was also the first end point of the second Bezier curve.
* A third click-hold would be the second end point.
* A third release would define the final curvature of the second curve, and it would also be the first control point of a third curve.

<!--T:24-->
This means that for every two click-hold (c-h) and release (r) sequences, the second sequence is already part of a subsequent curve segment, as indicated in the following graphic:

</translate>
<pre>
|c-h -- r -- c-h -- r| 1
|c-h -- r -- c-h -- r| 2
|c-h -- r -- c-h -- r| 3
|c-h -- r -- c-h -- r| 4
</pre>
<translate>

=== How to exactly place the control points === <!--T:25-->

<!--T:26-->
The graphical operation of this tool only allows the user to specify the first control point of the curve when it is being drawn. The second control point can be adjusted after the object is created: double click on the curve object in tree view, or select it and press {{Button|[[File:Draft_Edit.svg|16px]] [[Draft Edit|Edit]]}}. Then drag the second control point to the desired position.

<!--T:27-->
In order to choose exactly both end points and both control points, the Python command {{incode|Draft.makeBezCurve()}} must be used. See the [[#Scripting|Scripting]] section.


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


==Properties== <!--T:10-->
<!--T:28-->
See the options in [[Draft BezCurve|Draft BezCurve]].


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


=== View === <!--T:12-->
<!--T:29-->
See the properties in [[Draft BezCurve|Draft BezCurve]].


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


<!--T:17-->
{{Emphasis|See also:}} [[Draft API]] and [[FreeCAD Scripting Basics]].
{{Emphasis|See also:}} [[Draft API|Draft API]] and [[FreeCAD Scripting Basics|FreeCAD Scripting Basics]].

<!--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()}}.

<!--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.
* If only 3 points are given, it creates a quadratic Bezier instead, with only one control point.
* If only 2 points are given, it creates a linear Bezier, 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 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 7 points are given, the first 4 create a cubic Bezier segment; the 4th and the other three points are used to create a second cubic Bezier segment.
* In general, the last point in a group of four is shared with the following three points maximum to create another Bezier 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>.

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

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

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


</translate>
</translate>
Line 62: Line 128:
p3 = App.Vector(-1100, 2000, 0)
p3 = App.Vector(-1100, 2000, 0)
p4 = App.Vector(0, 0, 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()
rot = App.Rotation()


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


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

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

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

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

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

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

B7 = Draft.makeBezCurve([p1, p2, p3, p4, p5, p6, p7, p8], degree=3)
B7.Label = "B_cub+cub+lin"
B7.ViewObject.DrawStyle = "Dashed"
App.ActiveDocument.recompute()
App.ActiveDocument.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-->
<!--T:14-->
{{Docnav
{{Draft Tools navi}}
|[[Draft BezCurve|BezCurve]]

|[[Draft_Label|Label]]
<!--T:16-->
|[[Draft_Module|Draft]]
{{Userdocnavi}}
|IconL=Draft BezCurve.svg
|IconC=Workbench_Draft.svg
|IconR=Draft_Label.svg
}}


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

Revision as of 17:56, 21 February 2020

Draft CubicBezCurve

Menu location
Draft → Bezier tools → CubicBezCurve
Workbenches
Draft, Arch
Default shortcut
None
Introduced in version
0.19
See also
Draft Wire, Draft BSpline, Draft BezCurve

Description

The Draft CubicBezCurve tool creates a Bezier Curve of third degree (four points required). 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.

The Draft BezCurve and the Draft CubicBezCurve tools use control points to define the position and curvature of the spline; on the other hand the Draft BSpline tool specifies the exact points through which the curve will go.

Spline defined by three cubic Bezier segments. Each cubic Bezier is defined by four points, but when the tool is used graphically, only three such points are placed: 1-2-3 for the first segment, 3-4-5 for the second segment, and 5-6-7 for the third segment; the fourth point in each segment is defined implicitly; the last point 8 is necessary to finish the operation, and would be part of a fourth Bezier segment if the operation is continued.

Usage

  1. Press the Draft CubicBezCurve button.
  2. Click a first point on the 3D view, and hold the mouse button (1); this is the first end point.
  3. Drag the pointer to another point on the 3D view, and release the mouse button (2); this is the first control point.
  4. Move the pointer to another point on the 3D view, and click and hold the mouse button on this point (3); this is the second end point.
  5. Move the pointer to another point on the 3D view to adjust the final curvature of the spline, and then release the mouse button (4).
  6. At this moment you already have one Bezier curve of 3rd degree. The command can be completed by pressing Esc or the Close button, or you may repeat the process of clicking and holding (5), and dragging and releasing (6) to add more 3rd-degree Bezier segments.

Note that with this workflow you need two click-hold-release sequences to create a single Bezier curve of third degree.

  • The first click-hold defines the first end point.
  • The first release defines the first control point.
  • The second click-hold defines the second end point, and the general direction of the spline.
  • The second release defines the final curvature of the spline.
  • The second control point is not explicitly given, but is determined from the location of the pointer during the second release.

Notes

Creating several Bezier segments

  • The second release also correspond to the first control point of the subsequent Bezier curve.
  • This means that the second click-hold was also the first end point of the second Bezier curve.
  • A third click-hold would be the second end point.
  • A third release would define the final curvature of the second curve, and it would also be the first control point of a third curve.

This means that for every two click-hold (c-h) and release (r) sequences, the second sequence is already part of a subsequent curve segment, as indicated in the following graphic:

|c-h -- r -- c-h -- r| 1
            |c-h -- r -- c-h -- r| 2
                        |c-h -- r -- c-h -- r| 3
                                    |c-h -- r -- c-h -- r| 4

How to exactly place the control points

The graphical operation of this tool only allows the user to specify the first control point of the curve when it is being drawn. The second control point can be adjusted after the object is created: double click on the curve object in tree view, or select it and press Edit. Then drag the second control point to the desired position.

In order to choose exactly both end points and both control points, the Python command Draft.makeBezCurve() must be used. See the Scripting section.

Options

See the options in Draft BezCurve.

Properties

See the properties in Draft BezCurve.

Scripting

See also: Draft API and FreeCAD Scripting Basics.

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

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.

  • If only 3 points are given, it creates a quadratic Bezier instead, with only one control point.
  • If only 2 points are given, it creates a linear Bezier, 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 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 7 points are given, the first 4 create a cubic Bezier segment; the 4th and the other three points are used to create a second cubic Bezier segment.
  • In general, the last point in a group of four is shared with the following three points maximum to create another Bezier 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 Bezier curves produced by using 2, 3, 4, 5, 6, 7, and 8 points. The solid lines indicate cubic Bezier segments; the other lines are quadratic or linear.

Example:

import FreeCAD as App
import Draft

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

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

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

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

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

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

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

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