FreeCAD「斜め方向に角をカットする方法」をyoutubeで勉強中

**(追記)マクロ記録の使い方を教えて下さい。** 間違いがあれば、コメント下さい。
よろしくお願いいたします。

インストール方法は、公式ページを見て下さい。
または、[FreeCAD 使い方メモ](https://www.xsim.info/articles/FreeCAD/How-to-use-FreeCAD.html)　がわかりやすいです。


インストール後、**以下のFreeCAD操作ができたら、自信がつきます。**
①入門講座。奥が深いと思いました。2次元CADをかじった事がある方は、拘束(constraint)という考えは、新鮮？に感じるかもしれません。
②workbenchの切り替え。SketcherとPart designの切り替えに慣れが必要です。


# オリジナル
まず1回、動画を5分38秒見て下さい。

https://www.youtube.com/watch?v=SkZ9DgywuZo

続けて参考になると思います。(順不同)
[【FreeCAD 0.20】起動してみよう](https://www.youtube.com/watch?v=NeWq7Ds6ufc)
[【FreeCAD 0.20】拘束のしくみについて](https://www.youtube.com/watch?v=XRBD9o_8rIc&t=728s)


# 上記の操作を「FreeCAD 使い方メモ - XSim」で調べました。
ツール・リファレンス(英語のリンクもついています。)＜

https://www.xsim.info/articles/FreeCAD/How-to-use-FreeCAD.html#tools

[FreeCAD パートデザインワークベンチ概要](https://www.xsim.info/articles/FreeCAD/PartDesignWorkbench.html)
[FreeCAD スケッチャーワークベンチ　概要](https://www.xsim.info/articles/FreeCAD/SketcherWorkbench.html)


以下抜粋です。
00:00　[ボディーを作成](https://www.xsim.info/articles/FreeCAD/PartDesignWorkbench.html)　形状の入れ物となるボディーコンテナーを作成します。パートデザインワークベンチでは3次元形状は必ずボディー内にある必要があります。
00:00　[スケッチ面を作成](https://www.xsim.info/articles/FreeCAD/PartDesignWorkbench.html)　スケッチ面を新しく作成します。3次元形状の面が選択されている場合はその面に関連付けられたスケッチ面を作成します。
00:15　[四角形の作成（1）](https://www.xsim.info/articles/FreeCAD/tools/Sketcher_Rectangle.html)対角となる2点を指定してスケッチ面上に四角形を作成します。 
00:27　[対称拘束](https://www.xsim.info/articles/FreeCAD/tools/Constraint_Symmetric.html) 	指定された2点が指定された直線または点に対して対称な位置になるように拘束します。
00:37　[垂直押し出し](https://www.xsim.info/articles/FreeCAD/tools/PartDesign_Pad.html)	スケッチを垂直方向に押し出して形状を作成します。
00:56　[外部形状から補助線を作成](https://www.xsim.info/articles/FreeCAD/tools/Sketcher_External.html)　スケッチに関連付けられた形状からスケッチ作成用の補助線を作成します。
01:04　[直線の作成](https://www.xsim.info/articles/FreeCAD/tools/Sketcher_Line.html)　開始点、終了点の2点を指定してスケッチ面上に直線を作成します。
01:35　[点を線上に拘束](https://www.xsim.info/articles/FreeCAD/tools/Constraint_PointOnObject.html)	指定された点が指定された線上に乗るように拘束します。
01:43　[水平拘束](https://www.xsim.info/articles/FreeCAD/tools/Constraint_Horizontal.html)　指定された直線がスケッチ面の水平軸と平行になるように拘束します。
01:51　[垂直拘束](https://www.xsim.info/articles/FreeCAD/tools/Constraint_Vertical.html)	指定された直線がスケッチ面の垂直軸と平行になるように拘束します。
03:55　[データム面の作成](https://www.xsim.info/articles/FreeCAD/tools/PartDesign_Plane.html)　スケッチや他のデータム形状のための基準面を作成します。
04:54　[切り抜き](https://www.xsim.info/articles/FreeCAD/tools/PartDesign_Pocket.html)	スケッチに関連付けられた形状からスケッチを押し出した形状を取り除きます。関連付けられた形状がないスケッチでは使用できません。


# 上記の操作のショートカットを調べました。
抜粋です。ショートカット登録のカスタマイズの技もありました。

New,Ctrl + N

[PartDesign Workbench](https://wiki.freecadweb.org/Sandbox:Keyboard_Shortcuts#PartDesign_Workbench)
[Sketcher Workbench](https://wiki.freecadweb.org/Sandbox:Keyboard_Shortcuts#Sketcher_Workbench)
Sketcher_NewSketch,Create a new sketch,**ショートカットなし**
Sketcher_CreateRectangle,Create a rectangle in the sketch,**"G,R"**
Sketcher_ConstrainSymmetric,Create a symmetry constraint between two points with respect to a line or a third point,**S**

[PartDesign Workbench](https://wiki.freecadweb.org/Sandbox:Keyboard_Shortcuts#PartDesign_Workbench)
PartDesign_Pad,Pad a selected sketch,**ショートカットなし**

[Sketcher Workbench](https://wiki.freecadweb.org/Sandbox:Keyboard_Shortcuts#Sketcher_Workbench)
Sketcher_CreateLine,Create a line in the sketch	,**"G, L"**
ConstrainSymmetric.svg,Create a symmetry constraint between two points with respect to a line or a third point,**S**
Sketcher_External,Create an edge linked to an external geometry,**"G, X"**
Sketcher_CreateLine,Create a line in the sketch,**"G, L"**
Sketcher_ConstrainDistanceX,Fix the horizontal distance between two points or line ends,**L**

[PartDesign Workbench](https://wiki.freecadweb.org/Sandbox:Keyboard_Shortcuts#PartDesign_Workbench)
PartDesign_Plane,Create a new datum plane,**ショートカットなし**
PartDesign_Pocket,Create a pocket with the selected sketch,**ショートカットなし**

# (作業中)上記の操作をマクロ記録でやってみたい。

教えて下さい。直方体に線分1本だけ書けました。
「import Part」を追加しました。よろしくお願いいたします。
```python
# -*- coding: utf-8 -*-

# Macro Begin: C:\Users\xxxx\AppData\Roaming\FreeCAD\Macro\0-2056.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++
import FreeCAD
import PartDesign
import PartDesignGui
import Sketcher


import Part

# Gui.runCommand('Std_DlgMacroRecord',0)
### Begin command Std_Workbench
# Gui.activateWorkbench("PartDesignWorkbench")
### End command Std_Workbench
### Begin command PartDesign_Body
App.activeDocument().addObject('PartDesign::Body','Body')
# import PartDesignGui
# Gui.activateView('Gui::View3DInventor', True)
# Gui.activeView().setActiveObject('pdbody', App.activeDocument().Body)
# Gui.Selection.clearSelection()
# Gui.Selection.addSelection(App.ActiveDocument.Body)
App.ActiveDocument.recompute()
### End command PartDesign_Body
# Gui.Selection.addSelection('Unnamed','Body')
# Gui.runCommand('PartDesign_NewSketch',0)
# Gui.Selection.clearSelection()
# Gui.Selection.addSelection('Unnamed','Body','Origin.XY_Plane.')
App.getDocument('Unnamed').getObject('Body').newObject('Sketcher::SketchObject','Sketch')
App.getDocument('Unnamed').getObject('Sketch').Support = (App.getDocument('Unnamed').getObject('XY_Plane'),[''])
App.getDocument('Unnamed').getObject('Sketch').MapMode = 'FlatFace'
App.ActiveDocument.recompute()
# Gui.getDocument('Unnamed').setEdit(App.getDocument('Unnamed').getObject('Body'), 0, 'Sketch.')
# import Show
# ActiveSketch = App.getDocument('Unnamed').getObject('Sketch')
# tv = Show.TempoVis(App.ActiveDocument, tag= ActiveSketch.ViewObject.TypeId)
# ActiveSketch.ViewObject.TempoVis = tv
# if ActiveSketch.ViewObject.EditingWorkbench:
#   tv.activateWorkbench(ActiveSketch.ViewObject.EditingWorkbench)
# if ActiveSketch.ViewObject.HideDependent:
#   tv.hide(tv.get_all_dependent(App.getDocument('Unnamed').getObject('Body'), 'Sketch.'))
# if ActiveSketch.ViewObject.ShowSupport:
#   tv.show([ref[0] for ref in ActiveSketch.Support if not ref[0].isDerivedFrom("PartDesign::Plane")])
# if ActiveSketch.ViewObject.ShowLinks:
#   tv.show([ref[0] for ref in ActiveSketch.ExternalGeometry])
# tv.sketchClipPlane(ActiveSketch, ActiveSketch.ViewObject.SectionView)
# tv.hide(ActiveSketch)
# del(tv)
# del(ActiveSketch)
# 
# ActiveSketch = App.getDocument('Unnamed').getObject('Sketch')
# if ActiveSketch.ViewObject.RestoreCamera:
#   ActiveSketch.ViewObject.TempoVis.saveCamera()
#   if ActiveSketch.ViewObject.ForceOrtho:
#     ActiveSketch.ViewObject.Document.ActiveView.setCameraType('Orthographic')
# 
# Gui.Selection.clearSelection()
# Gui.runCommand('Sketcher_CompCreateRectangles',0)
geoList = []
geoList.append(Part.LineSegment(App.Vector(-66.666672,26.948589,0),App.Vector(36.152565,26.948589,0)))
geoList.append(Part.LineSegment(App.Vector(36.152565,26.948589,0),App.Vector(36.152565,-30.265341,0)))
geoList.append(Part.LineSegment(App.Vector(36.152565,-30.265341,0),App.Vector(-66.666672,-30.265341,0)))
geoList.append(Part.LineSegment(App.Vector(-66.666672,-30.265341,0),App.Vector(-66.666672,26.948589,0)))
App.getDocument('Unnamed').getObject('Sketch').addGeometry(geoList,False)
conList = []
conList.append(Sketcher.Constraint('Coincident',0,2,1,1))
conList.append(Sketcher.Constraint('Coincident',1,2,2,1))
conList.append(Sketcher.Constraint('Coincident',2,2,3,1))
conList.append(Sketcher.Constraint('Coincident',3,2,0,1))
conList.append(Sketcher.Constraint('Horizontal',0))
conList.append(Sketcher.Constraint('Horizontal',2))
conList.append(Sketcher.Constraint('Vertical',1))
conList.append(Sketcher.Constraint('Vertical',3))
App.getDocument('Unnamed').getObject('Sketch').addConstraint(conList)
del geoList, conList

# Gui.getDocument('Unnamed').resetEdit()
App.ActiveDocument.recompute()
# ActiveSketch = App.getDocument('Unnamed').getObject('Sketch')
# tv = ActiveSketch.ViewObject.TempoVis
# if tv:
#   tv.restore()
# ActiveSketch.ViewObject.TempoVis = None
# del(tv)
# del(ActiveSketch)
# 
# Gui.Selection.addSelection('Unnamed','Body','Sketch.')
App.getDocument('Unnamed').recompute()
### Begin command PartDesign_Pad
App.getDocument('Unnamed').getObject('Body').newObject('PartDesign::Pad','Pad')
App.getDocument('Unnamed').getObject('Pad').Profile = App.getDocument('Unnamed').getObject('Sketch')
App.getDocument('Unnamed').getObject('Pad').Length = 10
App.ActiveDocument.recompute()
App.getDocument('Unnamed').getObject('Pad').ReferenceAxis = (App.getDocument('Unnamed').getObject('Sketch'),['N_Axis'])
App.getDocument('Unnamed').getObject('Sketch').Visibility = False
App.ActiveDocument.recompute()
# App.getDocument('Unnamed').getObject('Pad').ViewObject.ShapeColor=getattr(App.getDocument('Unnamed').getObject('Body').getLinkedObject(True).ViewObject,'ShapeColor',App.getDocument('Unnamed').getObject('Pad').ViewObject.ShapeColor)
# App.getDocument('Unnamed').getObject('Pad').ViewObject.LineColor=getattr(App.getDocument('Unnamed').getObject('Body').getLinkedObject(True).ViewObject,'LineColor',App.getDocument('Unnamed').getObject('Pad').ViewObject.LineColor)
# App.getDocument('Unnamed').getObject('Pad').ViewObject.PointColor=getattr(App.getDocument('Unnamed').getObject('Body').getLinkedObject(True).ViewObject,'PointColor',App.getDocument('Unnamed').getObject('Pad').ViewObject.PointColor)
# App.getDocument('Unnamed').getObject('Pad').ViewObject.Transparency=getattr(App.getDocument('Unnamed').getObject('Body').getLinkedObject(True).ViewObject,'Transparency',App.getDocument('Unnamed').getObject('Pad').ViewObject.Transparency)
# App.getDocument('Unnamed').getObject('Pad').ViewObject.DisplayMode=getattr(App.getDocument('Unnamed').getObject('Body').getLinkedObject(True).ViewObject,'DisplayMode',App.getDocument('Unnamed').getObject('Pad').ViewObject.DisplayMode)
# Gui.getDocument('Unnamed').setEdit(App.getDocument('Unnamed').getObject('Body'), 0, 'Pad.')
# Gui.Selection.clearSelection()
### End command PartDesign_Pad
# Gui.Selection.clearSelection()
App.getDocument('Unnamed').getObject('Pad').Length = 50.000000
App.getDocument('Unnamed').getObject('Pad').TaperAngle = 0.000000
App.getDocument('Unnamed').getObject('Pad').UseCustomVector = 0
App.getDocument('Unnamed').getObject('Pad').Direction = (0, 0, 1)
App.getDocument('Unnamed').getObject('Pad').ReferenceAxis = (App.getDocument('Unnamed').getObject('Sketch'), ['N_Axis'])
App.getDocument('Unnamed').getObject('Pad').AlongSketchNormal = 1
App.getDocument('Unnamed').getObject('Pad').Type = 0
App.getDocument('Unnamed').getObject('Pad').UpToFace = None
App.getDocument('Unnamed').getObject('Pad').Reversed = 0
App.getDocument('Unnamed').getObject('Pad').Midplane = 0
App.getDocument('Unnamed').getObject('Pad').Offset = 0
App.getDocument('Unnamed').recompute()
# Gui.getDocument('Unnamed').resetEdit()
App.getDocument('Unnamed').getObject('Sketch').Visibility = False
# Gui.Selection.addSelection('Unnamed','Body','Pad.Face3',-7.6514,-30.2653,26.8587)
### Begin command PartDesign_NewSketch
App.getDocument('Unnamed').getObject('Body').newObject('Sketcher::SketchObject','Sketch001')
App.getDocument('Unnamed').getObject('Sketch001').Support = (App.getDocument('Unnamed').getObject('Pad'),['Face3',])
App.getDocument('Unnamed').getObject('Sketch001').MapMode = 'FlatFace'
App.ActiveDocument.recompute()
# Gui.getDocument('Unnamed').setEdit(App.getDocument('Unnamed').getObject('Body'), 0, 'Sketch001.')
# ActiveSketch = App.getDocument('Unnamed').getObject('Sketch001')
# tv = Show.TempoVis(App.ActiveDocument, tag= ActiveSketch.ViewObject.TypeId)
# ActiveSketch.ViewObject.TempoVis = tv
# if ActiveSketch.ViewObject.EditingWorkbench:
#   tv.activateWorkbench(ActiveSketch.ViewObject.EditingWorkbench)
# if ActiveSketch.ViewObject.HideDependent:
#   tv.hide(tv.get_all_dependent(App.getDocument('Unnamed').getObject('Body'), 'Sketch001.'))
# if ActiveSketch.ViewObject.ShowSupport:
#   tv.show([ref[0] for ref in ActiveSketch.Support if not ref[0].isDerivedFrom("PartDesign::Plane")])
# if ActiveSketch.ViewObject.ShowLinks:
#   tv.show([ref[0] for ref in ActiveSketch.ExternalGeometry])
# tv.sketchClipPlane(ActiveSketch, ActiveSketch.ViewObject.SectionView)
# tv.hide(ActiveSketch)
# del(tv)
# del(ActiveSketch)
# 
# ActiveSketch = App.getDocument('Unnamed').getObject('Sketch001')
# if ActiveSketch.ViewObject.RestoreCamera:
#   ActiveSketch.ViewObject.TempoVis.saveCamera()
#   if ActiveSketch.ViewObject.ForceOrtho:
#     ActiveSketch.ViewObject.Document.ActiveView.setCameraType('Orthographic')
# 
### End command PartDesign_NewSketch
# Gui.Selection.clearSelection()
# Gui.runCommand('Sketcher_External',0)
# Gui.Selection.addSelection('Unnamed','Body','Pad.Edge10',12.8034,-30.2653,50)
App.getDocument('Unnamed').getObject('Sketch001').addExternal("Pad","Edge10")
# Gui.Selection.clearSelection()
# Gui.Selection.addSelection('Unnamed','Body','Pad.Edge5',36.1526,-30.2653,32.6131)
App.getDocument('Unnamed').getObject('Sketch001').addExternal("Pad","Edge5")
# Gui.Selection.clearSelection()
# Gui.runCommand('Sketcher_CreateLine',0)
App.getDocument('Unnamed').getObject('Sketch001').addGeometry(Part.LineSegment(App.Vector(-25.912006,49.378466,0),App.Vector(35.544663,29.113157,0)),False)
App.getDocument('Unnamed').getObject('Sketch001').addConstraint(Sketcher.Constraint('PointOnObject',0,1,-3)) 
App.getDocument('Unnamed').getObject('Sketch001').addConstraint(Sketcher.Constraint('PointOnObject',0,2,-4)) 
# Gui.runCommand('Sketcher_ConstrainDistanceX',0)
# Gui.Selection.addSelection('Unnamed','Body','Sketch001.Vertex1',-25.9251,49.9878,0)
# Gui.Selection.addSelection('Unnamed','Body','Sketch001.Vertex4',36.1406,49.9888,0)
App.getDocument('Unnamed').getObject('Sketch001').addConstraint(Sketcher.Constraint('DistanceX',0,1,-4,2,62.064571)) 
App.getDocument('Unnamed').getObject('Sketch001').setDatum(2,App.Units.Quantity('10.000000 mm'))
# Gui.Selection.clearSelection()
# Gui.getDocument('Unnamed').resetEdit()
App.ActiveDocument.recompute()
# ActiveSketch = App.getDocument('Unnamed').getObject('Sketch001')
# tv = ActiveSketch.ViewObject.TempoVis
# if tv:
#   tv.restore()
# ActiveSketch.ViewObject.TempoVis = None
# del(tv)
# del(ActiveSketch)
# 
# Gui.Selection.addSelection('Unnamed','Body','Sketch001.')
App.getDocument('Unnamed').recompute()
# Macro End: C:\Users\xxxx\AppData\Roaming\FreeCAD\Macro\0-2056.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++
```

# 追加設定
起動後に自動ロードされるモジュールをStartからPartDesignに変更できます。
編集(E)>標準タブ>起動

# 大変勉強になりました。ありがとうございました。
youtube

https://www.youtube.com/c/%E3%81%BE%E3%81%8D%E3%81%B3%E6%8A%80%E8%A1%93%E7%A0%94%E7%A9%B6%E6%89%80/about

Blog

https://bugcode.blogspot.com/

# 参考

https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/PartDesign/Gui/Resources/translations/PartDesign_ja.ts

https://wiki.freecadweb.org/Sandbox:Keyboard_Shortcuts

https://www.scan2cad.com/blog/cad/freecad-keyboard-shortcuts/