CAM Profile/it: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
 
(18 intermediate revisions by the same user not shown)
Line 2: Line 2:


{{Docnav
{{Docnav
|[[CAM_ToolBitDock|ToolBitDock]]
|[[Path_Engrave|Engrave]]
|[[CAM_Pocket_Shape|PocketShape]]
|[[Path_Helix|Helix]]
|[[Path_Workbench|Path]]
|[[CAM_Workbench|CAM]]
|IconL=Path_Engrave.svg
|IconL=CAM_ToolBitDock.svg
|IconC=Workbench_Path.svg
|IconR=CAM_Pocket_Shape.svg
|IconR=Path_Helix.svg
|IconC=Workbench_CAM.svg
}}
}}


{{GuiCommand
<div class="mw-translate-fuzzy">
|Name=CAM Profile
{{GuiCommand/it|Name=Path Profile|Name/it=Profilo|Workbenches=[[Path Workbench/it|Path]]|MenuLocation=Path → Nuove Operazioni → Profilo|Shortcut=P,P|SeeAlso=}}
|MenuLocation=CAM → Profile
</div>
|Workbenches=[[CAM_Workbench|CAM]]
|Version=0.19
}}


==Descrizione==
==Description==


The [[Image:CAM_Profile.svg|16px]] [[CAM_Profile|Profile]] tool creates a contour operation based on selected features of the model. The tool was introduced in version 0.19. It offers three operations that were handled by separate tools in previous versions.
<div class="mw-translate-fuzzy">
Lo strumento Contornatura crea un semplice contorno di taglio esterno di un oggetto 3D complesso basato su [[Part Module/it|Part]]. L'intero modello in lavorazione funge da input per l'operazione, indipendentemente dal fatto che sia selezionata una geometria del corpo quando viene invocato il comando Contornatura. Si può abilitare un punto di partenza dall'editor delle operazioni, utilizzando una posizione definita nella Proprietà vista -> Punto iniziale.
</div>


All operations create objects that are made to be part of a {{KEY|[[Image:CAM_Job.svg|24px]] [[CAM_Job|CAM Job]]}}.
<div class="mw-translate-fuzzy">
[[Image:Path profile example.jpg]]
</div>


These are the available operations:
==Utilizzo==


===Contour operation===
<div class="mw-translate-fuzzy">
# Selezionare una faccia di un oggetto basato su [[Part Module/it|Parte]]. In alternativa, selezionare il bordo iniziale di tale faccia.
# Premere il pulsante {{KEY|[[Image:Path Profile.png|16px]] [[Path Profile/it|Profilo]]}}
# Regolare le proprietà desiderate
</div>


A {{KEY|Contour}} operation is the default. It creates a simple external contour cut of complex 3D [[Image:Workbench_Part.svg|24px]] [[Part_Workbench|Part]]-based objects. The entire Job Model serves as the input for the Operation, regardless of whether any Body Geometry is selected when the Contour command is invoked.
== Opzioni ==


===Profile Face operation===
* L'oggetto Profilo di Path è fatto per essere una parte di una [[Path Job/it|Lavorazione]]. Per configurare correttamente la profilatura, nell'oggetto macchina del progetto deve essere presente una tabella utensile, e prima del Profilo deve essere posizionato un comando [[Path ToolNumberToLoad/it|Utensile]].


A {{KEY|Profile Face}} operation creates a simple contour path from one or more selected faces of an object.

===Profile Edges operation===

A {{KEY|Profile Edges}} operation creates a simple contour path from selected edges.

[[Image:Path_profile_example.jpg|600px]]

==Usage==

# There are several ways to invoke the command:
#* Press the {{Button|[[Image:CAM_Profile.svg|16px]] [[CAM_Profile|CAM Profile]]}} button.
#* Select the {{MenuCommand|CAM → [[Image:CAM_Profile.svg|16px]] Profile}} option from the menu.
# Activate the Base Geometry section by clicking its tab, and select features from the Job model.
#* If no features are selected, the command defaults to a {{MenuCommand|Contour}} operation, contouring the entire model.
#* If faces are selected, then the result is a {{MenuCommand|Profile Face}} operation.
#* If edges are selected, then the result is a {{MenuCommand|Profile Edges}} operation.<br>'''NOTE''': This operation has received improvements to allow functionality on some open-edge (non-loop) selections. See the [[#Usage_Notes|Usage Notes]] section below for additional information on best practice for profiling open-edges.
# Activate the Operation section by clicking on its tab, and adjust the operation's settings as desired.
# Optionally press the {{Button|Apply}} button to preview the operation with the current settings.
# Click the {{Button|OK}} button or the {{Button|Cancel}} button to create or cancel the operation.

'''Important Note: CAM Profile doesn't take care of other details of the object. You have to adjust the properties, especially the final depth, carefully, a mistake might destroy your work piece'''

A Start point can be enabled from the Operation tab in the Tasks Window editor, using a location defined in the {{MenuCommand|Property View → Data → Start Point}}.

Make additional adjustments to the operation by modifying the operation's properties in the Data tab of the Property View. Advanced properties will be located here, if any.

==Usage Notes==

* The {{KEY|[[Image:CAM_Profile.svg|16px]] [[CAM_Profile|Profile]]}} operation is capable of profiling '''open-edges''' (one or more continuous edges that do not form a loop as seen from the ''Top View'')
** It is best to select the top edges (highest edges) for the selection. After doing so, you will need to manually set the Final Depth for the operation. Selection of bottom edges only is unpredictable and will likely return undesirable paths in many situations; however, it will return correct paths in some situations.
** Selected edges must form a continual edge ''as viewed from the Top View''. Selected top edges may have differing heights, so long as they connect at a common (X, Y) coordinate - differing Z-heights are acceptable in ''some'''**''''' cases. <BR />'''**'''In certain cases, the user will need to include in their selection the straight vertical connecting edge between two adjacent edges of different heights that share a common (X, Y) coordinate.
**Because top edges are selected, the Final Depth for the operation will need to be set manually.
** When profiling open-edges, the `Side` or `Cut Side` property is disabled internally even though it will likely be visible within the Task editor window and the Properties list within the Data tab.
* When profiling the entire model (a complete contour of the model) the `Side` or `Cut Side` property is hard coded to `Outside` even though it might be available for user input.

<span id="Properties"></span>
== Proprietà ==
== Proprietà ==


''' ''Note'' ''': Not all of these Properties are available in the Task Window Editor. Some are only accessible in the Data tab of the Properties View panel for this Operation.
''' ''Note'' ''': Not all of these Properties are available in the Task Window Editor. Some are only accessible in the Data tab of the Properties View panel for this Operation.


{{TitleProperty|Base}}
====Base====

Note: It is suggested that you do not edit the Placement property of path operations. Rather, move or rotate the Path Job model as needed.
Note: It is suggested that you do not edit the Placement property of path operations. Rather, move or rotate the CAM Job model as needed.


* {{PropertyData|Placement}}: Overall placement[position and rotation] of the object - with respect to the origin (or origin of parent object container)
* {{PropertyData|Placement}}: Overall placement[position and rotation] of the object - with respect to the origin (or origin of parent object container)
Line 55: Line 88:
* {{PropertyData|Label}}: User-provided name of the object (UTF-8)
* {{PropertyData|Label}}: User-provided name of the object (UTF-8)


{{TitleProperty|Depth}}
====Depth====


* {{PropertyData|Clearance Height}}: The height needed to clear clamps and obstructions
* {{PropertyData|Clearance Height}}: The height needed to clear clamps and obstructions
* {{PropertyData|Final Depth}}: Final Depth of Tool- lowest value in Z
* {{PropertyData|Final Depth}}: Final Depth of Tool- lowest value in Z
* {{PropertyData|Finish Depth}}: Maximum material removed on final pass. The height (thickness) of the last cutting level - ''set for a better finish''.
* {{PropertyData|Safe Height}}: The above which Rapid motions are allowed.
* {{PropertyData|Start Depth}}: Starting Depth of Tool- first cut depth in Z
* {{PropertyData|Safe Height}}: The height above which Rapid motions are allowed. (Rapid safety height between locations)
* {{PropertyData|Step Down}}: Incremental Step Down of Tool
* {{PropertyData|Start Depth}}: Starting depth of Tool - ''first cut depth in Z''
* {{PropertyData|Step Down}}: Incremental step down of Tool during operation


[[File:Path-DepthsAndHeights.gif|300px|center]]
====Path====
{{Caption|Visual reference for Depth properties (settings)}}

{{TitleProperty|Path}}


* {{PropertyData|Active}}: make False, to prevent operation from generating code
* {{PropertyData|Active}}: make False, to prevent operation from generating code
* {{PropertyData|Base}}: The base geometry for this operation
* {{PropertyData|Comment}}: An optional comment for this Operation
* {{PropertyData|Comment}}: An optional comment for this Operation
* {{PropertyData|User Label}}: User assigned label
* {{PropertyData|Coolant Mode}}: The coolant mode for this operation.
* {{PropertyData|Cycle Time}}: The cycle time estimation for this operation.
* {{PropertyData|Tool Controller}}: Defines the Tool controller used in the Operation
* {{PropertyData|Tool Controller}}: Defines the Tool controller used in the Operation
* {{PropertyData|User Label}}: User assigned label


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Line 74: Line 114:
</div>
</div>


* {{PropertyData|Direction}}: The direction that the tool path should go around the part: Clockwise[CW] or Counterclockwise[CCW]
<div class="mw-translate-fuzzy">
* {{PropertyData|Side}}: Lato del bordo che lo strumento deve tagliare
* {{PropertyData|Expand Profile}}: Extend the profile clearing beyond the Extra Offset.
* {{PropertyData|Expand Profile Step Over}}: Set the stepover percentage, based on the tool's diameter.
* {{PropertyData|Direction}}: La direzione in cui l'utensile deve muoversi intorno alla parte, orario CW o antiorario CCW
* {{PropertyData|RollRadius}}: Raggio iniziale e finale
* {{PropertyData|Handle Multiple Features}}: Choose how to process multiple Base Geometry features.
* {{PropertyData|OffsetExtra}}: Valore aggiuntivo di scostamento dal profilo finale - utile per il percorso dell'utensile di sgrossatura
* {{PropertyData|OffsetExtra}}: Extra value to stay away from final profile- good for roughing toolpath
* {{PropertyData|Process Circles}}: Check if you want this Profile Operation to also be applied to cylindrical holes, ''which normally get drilled''.
* {{PropertyData|SegLen}}: Valore di Tassellazione per percorsi utensili realizzati da Beziers, bspline e ellissi
* {{PropertyData|Process Holes}}: Check if this Profile Operation should also process holes in the base geometry. '''Note''' that this does not include cylindrical holes.
</div>
* {{PropertyData|Process Perimeter}}: Check if this Profile Operation should also process the outside perimeter of the base geometry shapes
* {{PropertyData|Side}}: (Cut Side) Side of edge that tool should cut. This only matters if `Use Compensation` is True(checked).
* {{PropertyData|Use Compensation}}: If checked, the Profile Operation is offset by the tool radius. The offset direction is determined by the Cut Side.


====Rotation====
{{TitleProperty|Rotation}}


* {{PropertyData|Attempt Inverse Angle}}: Automatically attempt Inverse Angle if initial rotation is incorrect.
* {{PropertyData|Attempt Inverse Angle}}: Automatically attempt Inverse Angle if initial rotation is incorrect.
* <s>{{PropertyData|B_Axis Error Override}}: Visually orient B(y) rotations to model (error in FreeCAD rendering).</s>
* {{PropertyData|Enable Rotation}}: Enable rotation to gain access to pockets or areas not normal to Z axis.
* {{PropertyData|Enable Rotation}}: Enable rotation to gain access to pockets or areas not normal to Z axis.
* {{PropertyData|Inverse Angle}}: Inverse the angle of the rotation. '' '''Example:''' change a rotation from -22.5 to 22.5 degrees.''
* {{PropertyData|Inverse Angle}}: Inverse the angle of the rotation. '' '''Example:''' change a rotation from -22.5 to 22.5 degrees.''
* {{PropertyData|Limit Depth To Face}}: Enforce the Z-depth of the selected face as the lowest value for final depth. Higher user values for final depth will be observed.
* {{PropertyData|Reverse Direction}}: Reverse orientation of Operation by 180 degrees.
* {{PropertyData|Reverse Direction}}: Reverse orientation of Operation by 180 degrees.


{{TitleProperty|Start Point}}
<div class="mw-translate-fuzzy">
===Proprietà Start Point===
</div>


* {{PropertyData|Start Point}}: The custom start point for the path of this operation.
<div class="mw-translate-fuzzy">
* {{PropertyData|Start Point}}: Il punto di partenza di questo percorso
** {{PropertyData|X}}: x distance value
* {{PropertyData|Use Start Point}}: Impostare True, se si specifica un Start Point
** {{PropertyData|Y}}: y distance value
** {{PropertyData|Z}}: z distance value
* {{PropertyData|Extend At Start}}: lunghezza extra del percorso utensile prima dell'inizio del bordo della parte
* {{PropertyData|LeadIn Line Len}}: lunghezza del tratto rettilineo del percorso utensile che entra ad angolo rispetto al primo bordo della parte
* {{PropertyData|Use Start Point}}: Make True, if manually specifying a Start Point. Set the start point in the property data Start Point field.
</div>

<div class="mw-translate-fuzzy">
===Proprietà End Point===
</div>


==Tasks Window Editor Layout==
* {{PropertyData|Use End Point}}: Impostare True, se si specifica un End Point
* {{PropertyData|Extend At End}}: lunghezza extra di percorso utensile dopo la fine del bordo della parte
* {{PropertyData|LeadOut LineLen}}: lunghezza del tratto rettilineo del percorso utensile che esce ad angolo rispetto all'ultimo bordo della parte
* {{PropertyData|End Point}}: Il punto finale di questo percorso



===<span sytle="color:red;">Extras, Not-in-use, or Degraded</span>===
* {{PropertyData|Use Placements}}: make True, if using the profile operation placement properties to transform toolpath in post processor
* {{PropertyData|SegLen}}: Tesselation value for tool paths made from beziers, bsplines, and ellipses

==Tasks Window Editor Layout==
''Descriptions for the settings are provided in the Properties list above.''
''Descriptions for the settings are provided in the Properties list above.''
This section is simply a layout map of the settings in the window editor for the Operation.
This section is simply a layout map of the settings in the window editor for the Operation.


====Base Geometry====
===Base Geometry===


* '''Add''': adds selected element(s) which should be the base(s) for the path(s)
* '''Add''': Adds selected element(s) which should be the base(s) for the path(s)
* '''Delete''': delete the selected item(s) in the Base Geometry list
* '''Delete''': Delete the selected item(s) in the Base Geometry list
* '''Clear''': clear all items in the Base Geometry list
* '''Clear''': Clear all items in the Base Geometry list


====Depth====
===Depths===


* {{PropertyData|Start Depth}}
* {{PropertyData|Start Depth}}
Line 131: Line 158:
* {{PropertyData|Step Down}}
* {{PropertyData|Step Down}}


====Height====
===Heights===


* {{PropertyData|Safe Height}}
* {{PropertyData|Safe Height}}
* {{PropertyData|Clearance Height}}
* {{PropertyData|Clearance Height}}


====Operation====
===Operation===


* {{PropertyData|Tool Controller}}
* {{PropertyData|Tool Controller}}
* {{PropertyData|Cut Side}}
* {{PropertyData|Coolant Mode}}
* {{PropertyData|Cut Side **}}
* {{PropertyData|Direction}}
* {{PropertyData|Direction}}
* {{PropertyData|Extra Offset}}
* {{PropertyData|Extra Offset}}
* {{PropertyData|Enable Rotation}}
* {{PropertyData|Use Start Point}}
* {{PropertyData|Use Start Point}}
* {{PropertyData|Use Compensation}}
* {{PropertyData|Use Compensation}}
* {{PropertyData|Process Holes}}
* {{PropertyData|Process Holes **}}
* {{PropertyData|Process Circles}}
* {{PropertyData|Process Circles **}}
* {{PropertyData|Process Perimeter}}
* {{PropertyData|Process Perimeter **}}
'''<nowiki>**</nowiki>''' Availability changes based on selections in Base Geometry section.

==Scripting==

{{Emphasis|See also:}} [[FreeCAD_Scripting_Basics|FreeCAD Scripting Basics]].

Example:

{{Code|code=
#Place code example here.
}}



{{Docnav
{{Docnav
|[[CAM_ToolBitDock|ToolBitDock]]
|[[Path_Engrave|Engrave]]
|[[CAM_Pocket_Shape|PocketShape]]
|[[Path_Helix|Helix]]
|[[Path_Workbench|Path]]
|[[CAM_Workbench|CAM]]
|IconL=Path_Engrave.svg
|IconL=CAM_ToolBitDock.svg
|IconC=Workbench_Path.svg
|IconR=CAM_Pocket_Shape.svg
|IconR=Path_Helix.svg
|IconC=Workbench_CAM.svg
}}
}}


{{CAM_Tools_navi{{#translation:}}}}
<!--T:42-->
{{Path_Tools_navi{{#translation:}}}}
{{Userdocnavi{{#translation:}}}}
{{Userdocnavi{{#translation:}}}}
{{clear}}

Latest revision as of 20:41, 28 March 2024

CAM Profile

Menu location
CAM → Profile
Workbenches
CAM
Default shortcut
None
Introduced in version
0.19
See also
None

Description

The Profile tool creates a contour operation based on selected features of the model. The tool was introduced in version 0.19. It offers three operations that were handled by separate tools in previous versions.

All operations create objects that are made to be part of a CAM Job.

These are the available operations:

Contour operation

A Contour operation is the default. It creates a simple external contour cut of complex 3D Part-based objects. The entire Job Model serves as the input for the Operation, regardless of whether any Body Geometry is selected when the Contour command is invoked.

Profile Face operation

A Profile Face operation creates a simple contour path from one or more selected faces of an object.

Profile Edges operation

A Profile Edges operation creates a simple contour path from selected edges.

Usage

  1. There are several ways to invoke the command:
    • Press the CAM Profile button.
    • Select the CAM → Profile option from the menu.
  2. Activate the Base Geometry section by clicking its tab, and select features from the Job model.
    • If no features are selected, the command defaults to a Contour operation, contouring the entire model.
    • If faces are selected, then the result is a Profile Face operation.
    • If edges are selected, then the result is a Profile Edges operation.
      NOTE: This operation has received improvements to allow functionality on some open-edge (non-loop) selections. See the Usage Notes section below for additional information on best practice for profiling open-edges.
  3. Activate the Operation section by clicking on its tab, and adjust the operation's settings as desired.
  4. Optionally press the Apply button to preview the operation with the current settings.
  5. Click the OK button or the Cancel button to create or cancel the operation.

Important Note: CAM Profile doesn't take care of other details of the object. You have to adjust the properties, especially the final depth, carefully, a mistake might destroy your work piece

A Start point can be enabled from the Operation tab in the Tasks Window editor, using a location defined in the Property View → Data → Start Point.

Make additional adjustments to the operation by modifying the operation's properties in the Data tab of the Property View. Advanced properties will be located here, if any.

Usage Notes

  • The Profile operation is capable of profiling open-edges (one or more continuous edges that do not form a loop as seen from the Top View)
    • It is best to select the top edges (highest edges) for the selection. After doing so, you will need to manually set the Final Depth for the operation. Selection of bottom edges only is unpredictable and will likely return undesirable paths in many situations; however, it will return correct paths in some situations.
    • Selected edges must form a continual edge as viewed from the Top View. Selected top edges may have differing heights, so long as they connect at a common (X, Y) coordinate - differing Z-heights are acceptable in some** cases.
      **In certain cases, the user will need to include in their selection the straight vertical connecting edge between two adjacent edges of different heights that share a common (X, Y) coordinate.
    • Because top edges are selected, the Final Depth for the operation will need to be set manually.
    • When profiling open-edges, the `Side` or `Cut Side` property is disabled internally even though it will likely be visible within the Task editor window and the Properties list within the Data tab.
  • When profiling the entire model (a complete contour of the model) the `Side` or `Cut Side` property is hard coded to `Outside` even though it might be available for user input.

Proprietà

Note : Not all of these Properties are available in the Task Window Editor. Some are only accessible in the Data tab of the Properties View panel for this Operation.

Base

Note: It is suggested that you do not edit the Placement property of path operations. Rather, move or rotate the CAM Job model as needed.

  • DatiPlacement: Overall placement[position and rotation] of the object - with respect to the origin (or origin of parent object container)
    • DatiAngle: Angle in degrees applied to rotation of the object around Axis property value
    • DatiAxis: Axis(one or multiple) around which to rotate the object, set in sub-properties: x, y, z
      • DatiX: x axis value
      • DatiY: y axis value
      • DatiZ: z axis value
    • DatiPosition: Position of the object, set in sub-properties: x, y, z - with respect to the origin (or origin of parent object container)
      • DatiX: x distance value
      • DatiY: y distance value
      • DatiZ: z distance value
  • DatiLabel: User-provided name of the object (UTF-8)

Depth

  • DatiClearance Height: The height needed to clear clamps and obstructions
  • DatiFinal Depth: Final Depth of Tool- lowest value in Z
  • DatiFinish Depth: Maximum material removed on final pass. The height (thickness) of the last cutting level - set for a better finish.
  • DatiSafe Height: The height above which Rapid motions are allowed. (Rapid safety height between locations)
  • DatiStart Depth: Starting depth of Tool - first cut depth in Z
  • DatiStep Down: Incremental step down of Tool during operation

Visual reference for Depth properties (settings)

Path

  • DatiActive: make False, to prevent operation from generating code
  • DatiBase: The base geometry for this operation
  • DatiComment: An optional comment for this Operation
  • DatiCoolant Mode: The coolant mode for this operation.
  • DatiCycle Time: The cycle time estimation for this operation.
  • DatiTool Controller: Defines the Tool controller used in the Operation
  • DatiUser Label: User assigned label

Proprietà Profilo

  • DatiDirection: The direction that the tool path should go around the part: Clockwise[CW] or Counterclockwise[CCW]
  • DatiExpand Profile: Extend the profile clearing beyond the Extra Offset.
  • DatiExpand Profile Step Over: Set the stepover percentage, based on the tool's diameter.
  • DatiHandle Multiple Features: Choose how to process multiple Base Geometry features.
  • DatiOffsetExtra: Extra value to stay away from final profile- good for roughing toolpath
  • DatiProcess Circles: Check if you want this Profile Operation to also be applied to cylindrical holes, which normally get drilled.
  • DatiProcess Holes: Check if this Profile Operation should also process holes in the base geometry. Note that this does not include cylindrical holes.
  • DatiProcess Perimeter: Check if this Profile Operation should also process the outside perimeter of the base geometry shapes
  • DatiSide: (Cut Side) Side of edge that tool should cut. This only matters if `Use Compensation` is True(checked).
  • DatiUse Compensation: If checked, the Profile Operation is offset by the tool radius. The offset direction is determined by the Cut Side.

Rotation

  • DatiAttempt Inverse Angle: Automatically attempt Inverse Angle if initial rotation is incorrect.
  • DatiEnable Rotation: Enable rotation to gain access to pockets or areas not normal to Z axis.
  • DatiInverse Angle: Inverse the angle of the rotation. Example: change a rotation from -22.5 to 22.5 degrees.
  • DatiLimit Depth To Face: Enforce the Z-depth of the selected face as the lowest value for final depth. Higher user values for final depth will be observed.
  • DatiReverse Direction: Reverse orientation of Operation by 180 degrees.

Start Point

  • DatiStart Point: The custom start point for the path of this operation.
    • DatiX: x distance value
    • DatiY: y distance value
    • DatiZ: z distance value
  • DatiUse Start Point: Make True, if manually specifying a Start Point. Set the start point in the property data Start Point field.

Tasks Window Editor Layout

Descriptions for the settings are provided in the Properties list above. This section is simply a layout map of the settings in the window editor for the Operation.

Base Geometry

  • Add: Adds selected element(s) which should be the base(s) for the path(s)
  • Delete: Delete the selected item(s) in the Base Geometry list
  • Clear: Clear all items in the Base Geometry list

Depths

  • DatiStart Depth
  • DatiFinal Depth
  • DatiStep Down

Heights

  • DatiSafe Height
  • DatiClearance Height

Operation

  • DatiTool Controller
  • DatiCoolant Mode
  • DatiCut Side **
  • DatiDirection
  • DatiExtra Offset
  • DatiEnable Rotation
  • DatiUse Start Point
  • DatiUse Compensation
  • DatiProcess Holes **
  • DatiProcess Circles **
  • DatiProcess Perimeter **

** Availability changes based on selections in Base Geometry section.

Scripting

See also: FreeCAD Scripting Basics.

Example:

#Place code example here.