diff --git a/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.srt b/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.srt
new file mode 100644
index 0000000..938f5dd
--- /dev/null
+++ b/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.srt
@@ -0,0 +1,104 @@
+1
+00:00:00,000 --> 00:00:06,300
+Welcome to Vanilla Blender. I figured before we get into Bonsai we can go
+
+2
+00:00:06,300 --> 00:00:11,760
+through some of the functionality that's native to just Blender and then later
+
+3
+00:00:11,760 --> 00:00:17,880
+just jump into Bonsai. When you open Blender you'll see three default objects
+
+4
+00:00:17,880 --> 00:00:24,480
+here a light a cube and a camera and those are outlined here in the outliner
+
+5
+00:00:24,480 --> 00:00:33,120
+on the side. To start I'm just gonna delete the camera and that light. Select
+
+6
+00:00:33,120 --> 00:00:41,080
+the cube. You can zoom in and out with the middle mouse button. To move the cube
+
+7
+00:00:41,080 --> 00:00:47,320
+click on this tool here and it'll come up with these axes and you can just
+
+8
+00:00:47,320 --> 00:00:51,400
+click and drag on them and start moving them in a certain direction and then you
+
+9
+00:00:51,400 --> 00:00:57,320
+can as you're doing that you can type in a distance so three meters again you
+
+10
+00:00:57,320 --> 00:01:04,560
+can do four meters and it moves the cube in that dimension. You can also if you
+
+11
+00:01:04,560 --> 00:01:09,840
+hover over any tool you'll see that there's a quick key that shows up the
+
+12
+00:01:09,840 --> 00:01:16,080
+this instance it's G so if you had the select tool here and you click the cube
+
+13
+00:01:16,080 --> 00:01:22,120
+and type G it'll start moving it and again you can lock it in the X Y or Z
+
+14
+00:01:22,120 --> 00:01:31,920
+and then type in a certain distance. As you can see we move the cube up here but
+
+15
+00:01:31,920 --> 00:01:39,620
+as I click on it and I try to zoom in on it it zooms to the origin here. I like to
+
+16
+00:01:39,620 --> 00:01:45,320
+change the preferences so it actually zooms to where my mouse is at so in
+
+17
+00:01:45,320 --> 00:01:54,160
+order to do that go to preferences and navigation and zoom to mouse position so
+
+18
+00:01:54,160 --> 00:01:58,919
+then it'll actually zoom to wherever your mouse is at which is very quite
+
+19
+00:01:58,919 --> 00:02:07,800
+helpful. The other helpful thing I like using is like to turn on statistics that
+
+20
+00:02:07,800 --> 00:02:14,400
+tells you more information about what you're selected and that can be here and
+
+21
+00:02:14,400 --> 00:02:20,600
+click on statistics you see over here it's like the cube it tells you a little
+
+22
+00:02:20,600 --> 00:02:25,000
+more information about it like the vertices edges and faces and various
+
+23
+00:02:25,000 --> 00:02:34,240
+triangles. There's another way and I actually prefer this way is to turn on
+
+24
+00:02:34,240 --> 00:02:40,160
+scene statistics from the preferences here and it shows that I've actually done
+
+25
+00:02:40,160 --> 00:02:46,520
+the slower right corner so I prefer that one a little better so I'm going to
+
+26
+00:02:46,520 --> 00:02:49,560
+just turn the other one off.
+
diff --git a/002000_20250218_1407 - moving, rotating, and scaling/002000_20250218_1407 - moving, rotating, and scaling.srt b/002000_20250218_1407 - moving, rotating, and scaling/002000_20250218_1407 - moving, rotating, and scaling.srt
new file mode 100644
index 0000000..fbc2b4d
--- /dev/null
+++ b/002000_20250218_1407 - moving, rotating, and scaling/002000_20250218_1407 - moving, rotating, and scaling.srt
@@ -0,0 +1,68 @@
+1
+00:00:00,000 --> 00:00:05,320
+So there's a couple other ways to move an object. If you select it you can go
+
+2
+00:00:05,320 --> 00:00:12,380
+over to the object properties here and change the dimension here. You can also
+
+3
+00:00:12,380 --> 00:00:25,360
+change the dimension relative to where it's at so three meters in X or 3 Y. You
+
+4
+00:00:25,360 --> 00:00:31,680
+can also change it here. This is called the end panel and meaning if you type N
+
+5
+00:00:31,680 --> 00:00:43,519
+it exposes the panel and the same thing is you can change it here and rotate say
+
+6
+00:00:43,519 --> 00:00:52,120
+45. You can also scale. Word of warning and you can change the dimensions here.
+
+7
+00:00:52,120 --> 00:01:01,440
+Word of warning when we get into bonsai don't use these ways to change the
+
+8
+00:01:01,440 --> 00:01:09,240
+geometry because it'll basically break the intelligent bonsai or BIM object. So
+
+9
+00:01:09,240 --> 00:01:18,380
+once we get into that don't use scale and dimension. You can also when you're
+
+10
+00:01:18,380 --> 00:01:27,660
+again moving this moves it in the these are kind of global axes that you see
+
+11
+00:01:27,660 --> 00:01:35,020
+here. They're not relative to how the cube is spun at a 45 now. If you want to
+
+12
+00:01:35,020 --> 00:01:40,820
+move that cube relative to how it has been rotated you would switch this to
+
+13
+00:01:40,820 --> 00:01:48,619
+local up here and then it flips the axis so you can move it along the axis
+
+14
+00:01:48,619 --> 00:02:01,100
+now. There's also you know other things where you can move it normal to a face. I
+
+15
+00:02:01,100 --> 00:02:07,339
+won't get into this but and view and move it relative to what you're looking
+
+16
+00:02:07,340 --> 00:02:12,380
+at right now. Kind of self-explanatory. I won't get into these. I usually use
+
+17
+00:02:12,380 --> 00:02:20,660
+global or local most of the time. I'm just going to go back to global there.
+
diff --git a/003000_20250218_1437 - 3d cursor/003000_20250218_1437 - 3d cursor.srt b/003000_20250218_1437 - 3d cursor/003000_20250218_1437 - 3d cursor.srt
new file mode 100644
index 0000000..e109a5b
--- /dev/null
+++ b/003000_20250218_1437 - 3d cursor/003000_20250218_1437 - 3d cursor.srt
@@ -0,0 +1,88 @@
+1
+00:00:00,000 --> 00:00:07,000
+Another visual aid to know about when moving an object is to turn on what's called object
+
+2
+00:00:07,000 --> 00:00:09,820
+gizmos up here.
+
+3
+00:00:09,820 --> 00:00:12,280
+Turn on move and rotate.
+
+4
+00:00:12,280 --> 00:00:18,820
+You can see it adds the axis and the little gimbal, rotation gimbal there.
+
+5
+00:00:18,820 --> 00:00:23,760
+So again you can just click on them and rotate it.
+
+6
+00:00:23,760 --> 00:00:34,320
+Notice that when I'm rotating something it's rotating it from the origin of the object
+
+7
+00:00:34,320 --> 00:00:39,640
+which in this instance is right in the middle of the cube there.
+
+8
+00:00:39,640 --> 00:00:44,040
+But let's say you want to rotate it from the edge of the cube.
+
+9
+00:00:44,040 --> 00:00:51,000
+You would use something called the 3D cursor which is kind of unique to Blender.
+
+10
+00:00:51,000 --> 00:00:59,340
+But it's basically a temporary origin so to speak which you can make transformations
+
+11
+00:00:59,340 --> 00:01:00,600
+based off of.
+
+12
+00:01:00,600 --> 00:01:08,880
+So in order to set that temporary origin or 3D cursor you first have to turn on snaps
+
+13
+00:01:08,880 --> 00:01:15,760
+here and we're going to change this to vertex instead.
+
+14
+00:01:15,760 --> 00:01:22,840
+So to create your 3D cursor you hold the shift key and then right click with your mouse.
+
+15
+00:01:22,840 --> 00:01:25,700
+You kind of right click and hold it.
+
+16
+00:01:25,700 --> 00:01:30,680
+I'm actually holding both the shift key and the right mouse button and you can see it
+
+17
+00:01:30,680 --> 00:01:34,320
+kind of snapping to those vertices there.
+
+18
+00:01:34,320 --> 00:01:38,400
+And then once you are done you can just let go.
+
+19
+00:01:38,400 --> 00:01:42,920
+And it's still rotating from the center.
+
+20
+00:01:42,920 --> 00:01:47,240
+Here's how you tell it basically where to rotate from.
+
+21
+00:01:47,240 --> 00:01:51,840
+And we want to tell it to go from the 3D cursor there.
+
+22
+00:01:51,840 --> 00:01:56,120
+So it changes the little gimbal and then you can rotate from there.
+
diff --git a/004000_20250218_1505 - duplicating, moving and rotating with base point/004000_20250218_1505 - duplicating, moving and rotating with base point.srt b/004000_20250218_1505 - duplicating, moving and rotating with base point/004000_20250218_1505 - duplicating, moving and rotating with base point.srt
new file mode 100644
index 0000000..9e992a6
--- /dev/null
+++ b/004000_20250218_1505 - duplicating, moving and rotating with base point/004000_20250218_1505 - duplicating, moving and rotating with base point.srt
@@ -0,0 +1,104 @@
+1
+00:00:00,000 --> 00:00:06,960
+So to duplicate an object, you would select it, go up to object pull down here, and go
+
+2
+00:00:06,960 --> 00:00:11,540
+to duplicate objects or shift D, which that's what I'm going to use.
+
+3
+00:00:11,540 --> 00:00:15,800
+So shift D, you can see it's has the duplicate here.
+
+4
+00:00:15,800 --> 00:00:17,320
+It's asking you where to move it.
+
+5
+00:00:17,320 --> 00:00:26,240
+And so like before you can type an axis and then the distance return.
+
+6
+00:00:26,240 --> 00:00:33,760
+So before we were using the 3D cursor to locate a kind of a temporary origin to rotate something,
+
+7
+00:00:33,760 --> 00:00:37,640
+but you can also use that to move an object too.
+
+8
+00:00:37,640 --> 00:00:42,239
+So again, I'm holding the shift and right mouse button.
+
+9
+00:00:42,239 --> 00:00:50,120
+And let's say you want to move that object on top of the other cube and you type G then.
+
+10
+00:00:50,120 --> 00:00:55,280
+Oh, it's not snapping correctly.
+
+11
+00:00:55,320 --> 00:00:59,680
+We want to change this to center instead.
+
+12
+00:00:59,680 --> 00:01:03,720
+We want to have this be 3D cursor and then this be center.
+
+13
+00:01:03,720 --> 00:01:11,960
+So we want to set our 3D cursor and then type G and there it snaps to where we want it to.
+
+14
+00:01:11,960 --> 00:01:23,160
+You can also use a method that's familiar to a lot of people that use CAD or Revit where
+
+15
+00:01:23,200 --> 00:01:29,759
+you set the snap point or the base point, kind of similar to what we just did,
+
+16
+00:01:29,759 --> 00:01:31,800
+but it's just another method.
+
+17
+00:01:31,800 --> 00:01:37,960
+So you type in G and it starts moving and then followed by B.
+
+18
+00:01:37,960 --> 00:01:45,120
+And then it asks you basically where do you want that base point to be?
+
+19
+00:01:45,120 --> 00:01:48,320
+And you can click on it and then you can move it.
+
+20
+00:01:48,960 --> 00:01:55,399
+So that's a workflow that's a lot of CAD users will be familiar with.
+
+21
+00:01:57,960 --> 00:02:04,800
+Another useful technique is to use both the 3D cursor and the B key to rotate an object
+
+22
+00:02:04,800 --> 00:02:06,440
+relative to another.
+
+23
+00:02:06,440 --> 00:02:14,079
+So for instance, I could place my 3D cursor here and start rotating type R and then B.
+
+24
+00:02:14,079 --> 00:02:16,240
+And then it's asking you for that base point.
+
+25
+00:02:16,240 --> 00:02:17,760
+So pick there.
+
+26
+00:02:17,760 --> 00:02:25,280
+And now we type Z to lock it in the Z rotation and then we can then snap to that other cube.
+
diff --git a/005000_20250218_1532 - edit mode and modifying vertices/005000_20250218_1532 - edit mode and modifying vertices.srt b/005000_20250218_1532 - edit mode and modifying vertices/005000_20250218_1532 - edit mode and modifying vertices.srt
new file mode 100644
index 0000000..94f43ef
--- /dev/null
+++ b/005000_20250218_1532 - edit mode and modifying vertices/005000_20250218_1532 - edit mode and modifying vertices.srt
@@ -0,0 +1,68 @@
+1
+00:00:00,000 --> 00:00:07,760
+So far we've learned to move an object, rotate it, you can scale it and change
+
+2
+00:00:07,760 --> 00:00:13,480
+the dimension. Again don't use these in Bonsai but you can use them now.
+
+3
+00:00:13,480 --> 00:00:17,120
+What if we want to change the actual individual vertices of the object itself?
+
+4
+00:00:17,120 --> 00:00:24,920
+To do that you select the objects and go to edit mode here or you can hit tab.
+
+5
+00:00:24,920 --> 00:00:30,680
+So tab, I'm in object mode now and if I hit tab again you're in edit mode.
+
+6
+00:00:30,680 --> 00:00:35,640
+Here you can see you can select individual vertices there. There's three selection
+
+7
+00:00:35,640 --> 00:00:46,200
+modes. You can select by vertices, line or the actual face. So if you select a
+
+8
+00:00:46,200 --> 00:00:53,400
+vertices there, again you can change your 3D cursor location and then move the
+
+9
+00:00:53,400 --> 00:01:08,039
+vertices there. Or you can do your GB where you set the GB and then
+
+10
+00:01:08,039 --> 00:01:16,560
+you can move it that way. You can create new typology or seams in there if you
+
+11
+00:01:16,560 --> 00:01:27,520
+select those two vertices you can type F and it creates a seam there. You can
+
+12
+00:01:27,520 --> 00:01:34,760
+also add more vertices. So if we do select that one, select that, you can
+
+13
+00:01:34,760 --> 00:01:40,640
+right-click and subdivide and you can see it added a vertices or you can add
+
+14
+00:01:40,640 --> 00:01:47,720
+multiple. You can see it's adding multiple there. Let's say you want to actually get rid of
+
+15
+00:01:47,720 --> 00:01:54,280
+those vertices now. One of two ways you can either delete and say
+
+16
+00:01:54,280 --> 00:02:05,760
+dissolve vertices. You can see they go away. Or you can go to clean up and limit
+
+17
+00:02:05,760 --> 00:02:10,240
+dissolve. That cleans it up as well.
+
diff --git a/006000_20250218_1550 - extruding in edit mode/006000_20250218_1550 - extruding in edit mode.srt b/006000_20250218_1550 - extruding in edit mode/006000_20250218_1550 - extruding in edit mode.srt
new file mode 100644
index 0000000..a0b773a
--- /dev/null
+++ b/006000_20250218_1550 - extruding in edit mode/006000_20250218_1550 - extruding in edit mode.srt
@@ -0,0 +1,100 @@
+1
+00:00:00,000 --> 00:00:06,400
+So you can extrude a point or vertex and create a line. You can select a line and
+
+2
+00:00:06,400 --> 00:00:11,600
+extrude it and make a plane. You can select a face and extrude that to make
+
+3
+00:00:11,600 --> 00:00:18,060
+kind of a volume. So here I'm just gonna select a vertice and I'm going to switch
+
+4
+00:00:18,060 --> 00:00:22,780
+this to bounding box and you'll see where the 3d cursor changes location to
+
+5
+00:00:22,780 --> 00:00:28,460
+what's selected there. And then I'm going to just change this to local and I'm
+
+6
+00:00:28,460 --> 00:00:33,020
+going to type E for extrude and then again I can lock it to an axis here.
+
+7
+00:00:33,020 --> 00:00:40,380
+Just gonna type in 1. I'm gonna extrude it again the other direction. Oops. And
+
+8
+00:00:40,380 --> 00:00:47,380
+we'll just snap to that and then extrude it again finally. Oops. And go back to
+
+9
+00:00:47,380 --> 00:00:55,940
+that point. You can select all these edges. Shift select them and type F and
+
+10
+00:00:55,940 --> 00:01:03,339
+it creates a face between those lines. You'll notice that at this intersection
+
+11
+00:01:03,339 --> 00:01:09,060
+here there's basically there should be two vertices there and when I select it
+
+12
+00:01:09,060 --> 00:01:16,259
+with the marquee there it only shows that one is selected. In order to
+
+13
+00:01:16,259 --> 00:01:19,820
+select both of them or select everything within it you have to change this to
+
+14
+00:01:19,820 --> 00:01:25,020
+x-ray mode and when you do that and then you do the marquee again it should
+
+15
+00:01:25,020 --> 00:01:30,179
+select the two vertices. The problem though if you select one and you just
+
+16
+00:01:30,179 --> 00:01:36,060
+say move it with G it's actually got you know the typology is kind of clunky
+
+17
+00:01:36,060 --> 00:01:42,899
+there. It would be ideal to basically merge those vertices together so they
+
+18
+00:01:42,899 --> 00:01:49,380
+act as one. In order to do that you would select both of them and go up to mesh
+
+19
+00:01:49,619 --> 00:01:57,060
+and merge by distance and whatever this is set to is usually good enough but you
+
+20
+00:01:57,060 --> 00:02:00,820
+can actually increase that distance where merges vertices further and
+
+21
+00:02:00,820 --> 00:02:05,940
+further apart but we're gonna say that's okay. Click off on it and now if we
+
+22
+00:02:05,940 --> 00:02:10,940
+select it is just one vertices and if we move it again then it all works
+
+23
+00:02:10,940 --> 00:02:18,340
+together like that. So it just like extruding points or vertices you can
+
+24
+00:02:18,340 --> 00:02:24,420
+extrude faces so select that and type E you can extrude up in that dimension as
+
+25
+00:02:24,420 --> 00:02:26,620
+well.
+
diff --git a/007000_20250218_1700 - various tools in edit mode/007000_20250218_1700 - various tools in edit mode.srt b/007000_20250218_1700 - various tools in edit mode/007000_20250218_1700 - various tools in edit mode.srt
new file mode 100644
index 0000000..f7f40d7
--- /dev/null
+++ b/007000_20250218_1700 - various tools in edit mode/007000_20250218_1700 - various tools in edit mode.srt
@@ -0,0 +1,64 @@
+1
+00:00:00,000 --> 00:00:05,760
+So a couple more useful tools when you're in edit mode. You can inset faces
+
+2
+00:00:05,760 --> 00:00:13,800
+with this icon here or go up to face do I inset faces. Dynamically changes you
+
+3
+00:00:13,800 --> 00:00:23,720
+can type in a value say 0.1. You can extrude that region out. We can subdivide
+
+4
+00:00:23,720 --> 00:00:29,360
+face like we did a line. Right-click subdivide. You can change the number of
+
+5
+00:00:29,400 --> 00:00:39,120
+cuts. Just gonna do one. You can use this extrude manifold tool to carve out space
+
+6
+00:00:39,120 --> 00:00:52,960
+which is kind of nice. You can bevel corners with this tool. Start dragging it in.
+
+7
+00:00:52,960 --> 00:00:58,960
+Then increase the number of segments here to make it more round at the corner.
+
+8
+00:00:58,960 --> 00:01:10,800
+You can use the knife tool to slice a face. Start at the edge. Type Z to hold
+
+9
+00:01:10,800 --> 00:01:26,240
+the axis and then enter to register it. I'm just gonna move this out. What other
+
+10
+00:01:26,240 --> 00:01:36,119
+tools are there? We can use this bisect tool. You need to select all the geometry
+
+11
+00:01:36,119 --> 00:01:41,679
+that you want to cut. I'm just gonna do type A to select everything and then
+
+12
+00:01:41,679 --> 00:01:50,080
+you can start just crossing it here. That's one mode where it basically
+
+13
+00:01:50,080 --> 00:01:56,640
+bisects the geometry. I'm gonna undo that. I'm gonna say clear outer. You can see how
+
+14
+00:01:56,640 --> 00:02:03,400
+it changes the bisect. I can clear inner. Goes the other direction I believe.
+
+15
+00:02:03,400 --> 00:02:11,360
+It's kind of useful. I think fill basically fills the end. I think that's how it works.
+
+16
+00:02:11,360 --> 00:02:16,000
+So that's quite useful sometimes.
+
diff --git a/008000_20250218_1714 - quick favorites and redoing a bevel/008000_20250218_1714 - quick favorites and redoing a bevel.srt b/008000_20250218_1714 - quick favorites and redoing a bevel/008000_20250218_1714 - quick favorites and redoing a bevel.srt
new file mode 100644
index 0000000..2948f30
--- /dev/null
+++ b/008000_20250218_1714 - quick favorites and redoing a bevel/008000_20250218_1714 - quick favorites and redoing a bevel.srt
@@ -0,0 +1,92 @@
+1
+00:00:00,000 --> 00:00:08,120
+I'm going to turn off X-ray mode and select that face and move it back to where it was.
+
+2
+00:00:08,120 --> 00:00:10,760
+And shift select both these faces.
+
+3
+00:00:10,760 --> 00:00:16,040
+I'm going to limit dissolve them or make them one face again.
+
+4
+00:00:16,040 --> 00:00:20,920
+And again that's under mesh and go to clean up and limited dissolve here.
+
+5
+00:00:20,920 --> 00:00:27,440
+I use this tool so much that you can actually add it to a quick favorite list.
+
+6
+00:00:27,440 --> 00:00:31,600
+It's a way to bring up tools that you use quite frequently.
+
+7
+00:00:31,600 --> 00:00:36,560
+And to do that you right click on it and say add to quick favorites.
+
+8
+00:00:36,560 --> 00:00:44,000
+So in that case or after that you can type Q and it brings up those quick favorites.
+
+9
+00:00:44,000 --> 00:00:50,560
+We only have one so far and so we want to limit dissolve that so it's one face.
+
+10
+00:00:50,560 --> 00:01:03,060
+So unfortunately let's say we want to change the radius of this corner.
+
+11
+00:01:03,060 --> 00:01:10,960
+Unfortunately once it's made there's not an easy way to reset it again.
+
+12
+00:01:10,960 --> 00:01:16,800
+So to kind of go back and redo it I'll show you a trick.
+
+13
+00:01:16,800 --> 00:01:25,600
+I got to go into X-ray mode again to select all the vertices there.
+
+14
+00:01:25,600 --> 00:01:31,640
+We want to set our 3D cursor again.
+
+15
+00:01:31,640 --> 00:01:40,840
+Shift right click at that point and start scaling that corner.
+
+16
+00:01:40,840 --> 00:01:45,240
+So what it's doing is scaling all directions X, Y, and Z.
+
+17
+00:01:45,240 --> 00:01:53,679
+You want to type in X in order to hold the scale and then type 0.
+
+18
+00:01:53,679 --> 00:01:56,320
+And that flattens out everything.
+
+19
+00:01:56,320 --> 00:02:00,600
+And then from there we want to limit dissolve all those faces again.
+
+20
+00:02:00,600 --> 00:02:05,360
+So we got a quick key now we're going to go limit to dissolve and then it flattens everything
+
+21
+00:02:05,360 --> 00:02:06,679
+out.
+
+22
+00:02:06,680 --> 00:02:13,880
+So now we can do what we did before, use the bevel tool, and redo it again.
+
+23
+00:02:13,880 --> 00:02:17,440
+If we want to change our segments like that.
+
diff --git a/009000_20250218_1735 - dimensioning tools/009000_20250218_1735 - dimensioning tools.srt b/009000_20250218_1735 - dimensioning tools/009000_20250218_1735 - dimensioning tools.srt
new file mode 100644
index 0000000..33fba92
--- /dev/null
+++ b/009000_20250218_1735 - dimensioning tools/009000_20250218_1735 - dimensioning tools.srt
@@ -0,0 +1,56 @@
+1
+00:00:00,000 --> 00:00:07,120
+So a couple ways to measure things in Blender, whether they're linear or area
+
+2
+00:00:07,120 --> 00:00:16,480
+dimensions. You can go up here and turn these helpers on. So edge length, edge
+
+3
+00:00:16,480 --> 00:00:27,520
+angle, face area. I don't use all these but anything you select then it'll
+
+4
+00:00:27,520 --> 00:00:32,720
+actually have the areas and the angles and the various dimensions. So that's
+
+5
+00:00:32,720 --> 00:00:42,040
+quite helpful at times. Or you can use this measure tool here and you just you
+
+6
+00:00:42,040 --> 00:00:50,960
+click and you hold to the next vertices and do that you know multiple times if
+
+7
+00:00:50,960 --> 00:01:00,680
+you want different areas. To turn a linear dimension like that into a angle
+
+8
+00:01:00,680 --> 00:01:07,760
+dimension you just click somewhere on a dimension line and drag and hold and
+
+9
+00:01:07,760 --> 00:01:15,400
+it converts it to a angle. And similarly if you want to grab it and then hit
+
+10
+00:01:15,400 --> 00:01:21,920
+delete it goes back to a linear dimension. You can change these too by
+
+11
+00:01:21,920 --> 00:01:32,480
+just grabbing the ends. To delete them it's somewhat cumbersome. Go to view and
+
+12
+00:01:32,480 --> 00:01:40,320
+go to annotations and click on that set there and go minus to delete it. And it
+
+13
+00:01:40,320 --> 00:01:44,520
+doesn't delete it right away but if you go to your select and go back to your
+
+14
+00:01:44,520 --> 00:01:48,759
+measure tool you can see that they're gone now.
+
diff --git a/010000_20250218_1749 - changing view orientation/010000_20250218_1749 - changing view orientation.srt b/010000_20250218_1749 - changing view orientation/010000_20250218_1749 - changing view orientation.srt
new file mode 100644
index 0000000..3a82fc7
--- /dev/null
+++ b/010000_20250218_1749 - changing view orientation/010000_20250218_1749 - changing view orientation.srt
@@ -0,0 +1,100 @@
+1
+00:00:00,000 --> 00:00:08,240
+There's a number of ways to move around or rotate around a model. The first you
+
+2
+00:00:08,240 --> 00:00:15,560
+can probably guess is to use this. If you click on the various letters you can see
+
+3
+00:00:15,560 --> 00:00:20,160
+that it's going to top view or front view or left view and you can keep kind
+
+4
+00:00:20,160 --> 00:00:29,760
+of rotating it. And you know middle mouse button to kind of pull out of it to zoom
+
+5
+00:00:29,760 --> 00:00:34,560
+into a certain view. You can hit shift and the middle mouse button to kind of
+
+6
+00:00:34,560 --> 00:00:46,400
+pan left and right or up and down. You can also use the num keypad. If you hit
+
+7
+00:00:46,400 --> 00:00:53,680
+seven it's the top view. One is I think a side and then three is the other side.
+
+8
+00:00:53,680 --> 00:01:03,040
+And then like four and six you can use to kind of rotate around you know one
+
+9
+00:01:03,040 --> 00:01:08,320
+way the other four and six or eight and two does the other direction up and down.
+
+10
+00:01:08,320 --> 00:01:17,360
+And then nine I think just kind of rotates 180 degrees. And you can find all
+
+11
+00:01:17,360 --> 00:01:28,039
+those quick keys here. You can see you know the seven is a top and bottom one
+
+12
+00:01:28,039 --> 00:01:37,039
+is front and back three is the right and left. And then there's the other ones
+
+13
+00:01:37,039 --> 00:01:43,520
+that we were using as well. So if you're in top view and you have an object that's
+
+14
+00:01:43,520 --> 00:01:52,280
+kind of rotated in space and you'd like to get one of these faces here viewed
+
+15
+00:01:52,280 --> 00:01:58,440
+straight on the way to do that is to select the object and go align to view
+
+16
+00:01:58,440 --> 00:02:05,039
+and whatever you're looking so we'll do top view here. So it rotates the camera
+
+17
+00:02:05,039 --> 00:02:11,480
+or view so it's aligned with the actual individual objects so that's quite useful
+
+18
+00:02:11,480 --> 00:02:21,200
+at times. So I can do that again do it the front view of that object. You can
+
+19
+00:02:21,200 --> 00:02:26,920
+also move around the model using a first-person shooter perspective and to
+
+20
+00:02:26,920 --> 00:02:34,480
+engage that you would do shift tilde oh sorry shift tilde and then you use your
+
+21
+00:02:34,480 --> 00:02:41,239
+keys if you're a gamer you're familiar with the you know WASD keys W moves
+
+22
+00:02:41,280 --> 00:02:50,200
+forward s back a little left and then D to the right Q is up and down or down
+
+23
+00:02:50,200 --> 00:02:58,040
+rather and then E is up so that's quite useful now you can actually hold down the
+
+24
+00:02:58,040 --> 00:03:06,200
+shift key and like W and move faster if you want so that's that's without the
+
+25
+00:03:06,200 --> 00:03:13,239
+shift key and then that's with the shift key just goes faster very useful
+
diff --git a/011000_20250218_1816 - Duplicate Linked/011000_20250218_1816 - Duplicate Linked.srt b/011000_20250218_1816 - Duplicate Linked/011000_20250218_1816 - Duplicate Linked.srt
new file mode 100644
index 0000000..463b2d8
--- /dev/null
+++ b/011000_20250218_1816 - Duplicate Linked/011000_20250218_1816 - Duplicate Linked.srt
@@ -0,0 +1,76 @@
+1
+00:00:00,000 --> 00:00:08,320
+So we learned about shift D already where it just creates another duplicate.
+
+2
+00:00:08,320 --> 00:00:13,000
+But each one of these instances is not connected to each other so if we change the geometry
+
+3
+00:00:13,000 --> 00:00:15,920
+of this one it's not going to change this one.
+
+4
+00:00:15,920 --> 00:00:23,840
+There is a duplicate link or link duplicate that we can use.
+
+5
+00:00:23,840 --> 00:00:29,040
+You find that under object here and duplicate link so alt D that's what I'm going to use.
+
+6
+00:00:29,040 --> 00:00:37,720
+So alt D and now if you change the geometry of one of these objects both of them will
+
+7
+00:00:37,720 --> 00:00:44,320
+change which is quite nice.
+
+8
+00:00:44,320 --> 00:00:52,599
+If you would like to select let's say you have you do a bunch of alt D's and you got
+
+9
+00:00:52,600 --> 00:00:59,820
+a ton of these around your project and you want to select all of these together you would
+
+10
+00:00:59,820 --> 00:01:05,040
+go under select and go select link and object data.
+
+11
+00:01:05,040 --> 00:01:09,600
+You can also select these other criteria which we haven't got to yet you know common materials
+
+12
+00:01:09,600 --> 00:01:16,100
+and whatnot but just use object data and then it will select basically all those types.
+
+13
+00:01:16,100 --> 00:01:22,860
+This workflow will change slightly in bonsai.
+
+14
+00:01:22,860 --> 00:01:29,140
+You don't use alt D as much but we'll get to that later.
+
+15
+00:01:29,140 --> 00:01:37,500
+You can also add geometry to another geometry after the fact so let's say we want to add
+
+16
+00:01:37,500 --> 00:01:40,699
+this cube to this geometry.
+
+17
+00:01:40,700 --> 00:01:51,500
+So select the geometry that you want to add the object to or the last selection there
+
+18
+00:01:51,500 --> 00:02:00,700
+and then go to object and go join and it should add that cube to and then you can see it duplicated
+
+19
+00:02:00,700 --> 00:02:03,500
+to all the various types.
+
diff --git a/012000_20250218_1829 - Collection Instances/012000_20250218_1829 - Collection Instances.srt b/012000_20250218_1829 - Collection Instances/012000_20250218_1829 - Collection Instances.srt
new file mode 100644
index 0000000..99268db
--- /dev/null
+++ b/012000_20250218_1829 - Collection Instances/012000_20250218_1829 - Collection Instances.srt
@@ -0,0 +1,80 @@
+1
+00:00:00,000 --> 00:00:10,000
+So in the outliner here you can change the name of the collection. Just double click on it.
+
+2
+00:00:10,000 --> 00:00:17,000
+Here you can see the various objects within the collection.
+
+3
+00:00:17,000 --> 00:00:22,000
+And again, same thing, you can change the name.
+
+4
+00:00:22,000 --> 00:00:25,000
+One cube.
+
+5
+00:00:25,000 --> 00:00:32,000
+If you click down on this arrow here, you can kind of get a sense of how things are organized.
+
+6
+00:00:32,000 --> 00:00:37,000
+Where this first level is the overall object.
+
+7
+00:00:37,000 --> 00:00:42,000
+And then in that is the mesh, or the vertices.
+
+8
+00:00:42,000 --> 00:00:45,000
+And then the materials applied to that.
+
+9
+00:00:45,000 --> 00:00:56,000
+If you select the object and type tab to get into edit mode, you'll see that it actually highlights that mesh cube.
+
+10
+00:00:56,000 --> 00:01:00,000
+If I keep doing that, you can see tab in and out.
+
+11
+00:01:01,000 --> 00:01:12,000
+Similar to linked duplicates for objects, you can kind of do linked duplicates for collections.
+
+12
+00:01:12,000 --> 00:01:16,000
+They're called collection instances.
+
+13
+00:01:16,000 --> 00:01:27,000
+And to do that, the UI is a little strange, but you would go to add and down to collection instance and then stuff.
+
+14
+00:01:27,000 --> 00:01:35,000
+And it creates another instance in world. You can move that around as you see fit.
+
+15
+00:01:35,000 --> 00:01:44,000
+And you can do shift D again with these. You don't have to do alt D. Shift D will just keep that connection alive.
+
+16
+00:01:44,000 --> 00:01:54,000
+In order to change one of these instances, you have to go back to the original and we can kind of just move some objects around.
+
+17
+00:01:54,000 --> 00:02:03,000
+Unfortunately, you can't edit these collection instances in place. You have to go back to the original.
+
+18
+00:02:03,000 --> 00:02:14,000
+Luckily, there is a plugin that I highly recommend called Group Pro that allows you to do that to edit the individual instances in place.
+
+19
+00:02:14,000 --> 00:02:15,000
+Quite helpful.
+
+20
+00:02:15,000 --> 00:02:30,000
+And again, if you want to select all the instances that are linked, go here again, select go instance collection.
+
diff --git a/013000_20250219_1239 - moving geometrys origin/013000_20250219_1239 - moving geometrys origin.srt b/013000_20250219_1239 - moving geometrys origin/013000_20250219_1239 - moving geometrys origin.srt
new file mode 100644
index 0000000..3726282
--- /dev/null
+++ b/013000_20250219_1239 - moving geometrys origin/013000_20250219_1239 - moving geometrys origin.srt
@@ -0,0 +1,88 @@
+1
+00:00:00,000 --> 00:00:06,360
+One shortcut key I forgot to mention is the number 5 on your num keypad. If you
+
+2
+00:00:06,360 --> 00:00:11,560
+toggle that on and off it flips between axon or orthographic mode and then
+
+3
+00:00:11,560 --> 00:00:18,000
+perspective. So good feature to know. Let me clean up a few things here it's
+
+4
+00:00:18,000 --> 00:00:25,160
+getting a little chaotic. If you select any geometry you'll see this little dot
+
+5
+00:00:25,160 --> 00:00:32,240
+on the geometry that indicates the origin of that geometry and so if you
+
+6
+00:00:32,240 --> 00:00:39,720
+toggle this mode here to the bounding box it moves the rotate and the move
+
+7
+00:00:39,720 --> 00:00:44,680
+gimbal to that location. But if you want to change the location of that origin
+
+8
+00:00:44,680 --> 00:00:49,800
+somewhere else on the geometry or not on the geometry the easiest way to do that
+
+9
+00:00:49,800 --> 00:00:56,599
+is to use your 3d cursor and move that to where you want the new origin to be
+
+10
+00:00:56,599 --> 00:01:04,200
+at and go up here and set origin and origin to 3d cursor. You can do that
+
+11
+00:01:04,200 --> 00:01:11,080
+again origin to 3d cursor or there's other options you can see here geometry
+
+12
+00:01:11,080 --> 00:01:17,400
+to origin so I think it takes the centroid of that geometry and moves it
+
+13
+00:01:17,400 --> 00:01:26,040
+to the origin. These two options the origin to center and of the surface and
+
+14
+00:01:26,040 --> 00:01:30,920
+volume are somewhat similar I'm not quite sure the subtleties of it but you
+
+15
+00:01:30,920 --> 00:01:42,240
+know you know they exist and they might come in handy. There's also two if you do
+
+16
+00:01:42,240 --> 00:01:49,839
+shift s there's similar functionality and a couple more things that you can
+
+17
+00:01:49,839 --> 00:01:54,240
+use I won't go through every one of these but you can kind of play around
+
+18
+00:01:54,240 --> 00:02:03,960
+with them and you'll kind of see what they ultimately do.
+
+19
+00:02:03,960 --> 00:02:16,720
+There's another way you can move the geometry's origin you select the object
+
+20
+00:02:16,720 --> 00:02:24,600
+go to tool and click on this effects only origins you'll see that the cursor
+
+21
+00:02:24,600 --> 00:02:31,240
+changes and you can then move that origin with the G key to where you'd
+
+22
+00:02:31,240 --> 00:02:36,640
+like it to be and then when you're done click that.
+
diff --git a/014000_20250219_1302 - Overview of Blenders interface/014000_20250219_1302 - Overview of Blenders interface.srt b/014000_20250219_1302 - Overview of Blenders interface/014000_20250219_1302 - Overview of Blenders interface.srt
new file mode 100644
index 0000000..d1580f7
--- /dev/null
+++ b/014000_20250219_1302 - Overview of Blenders interface/014000_20250219_1302 - Overview of Blenders interface.srt
@@ -0,0 +1,68 @@
+1
+00:00:00,000 --> 00:00:07,760
+So Blender's interface is composed of individual panels and those panels are
+
+2
+00:00:07,760 --> 00:00:16,320
+basically these windows here. That's one panel, here's another, here's another, and
+
+3
+00:00:16,320 --> 00:00:26,760
+then here's another. And all those panels basically create a workspace. And so
+
+4
+00:00:26,800 --> 00:00:32,040
+right now we're in the layout workspace and these are other various workspaces
+
+5
+00:00:32,040 --> 00:00:39,800
+that come as default in Blender. And you actually can create your own. You
+
+6
+00:00:39,800 --> 00:00:48,720
+can seed it with another workspace and then rename it as you wish and delete it.
+
+7
+00:00:48,720 --> 00:00:56,720
+These various panels then are somewhat arbitrary. If you click on here on
+
+8
+00:00:56,720 --> 00:01:08,200
+each one you can see which panel is named. And ultimately as you probably
+
+9
+00:01:08,200 --> 00:01:14,840
+guessed you can change what the panel is. So if you want a 3D viewport here you
+
+10
+00:01:14,840 --> 00:01:22,680
+can change that there or go back to the Outliner. You can actually create more
+
+11
+00:01:22,680 --> 00:01:30,840
+panels in a workspace by hovering at the corner where the cursor changes to
+
+12
+00:01:30,840 --> 00:01:37,300
+across here, there you see, and then pull down and hold and drag to one side or
+
+13
+00:01:37,300 --> 00:01:45,300
+the other to create a new panel. And then if ultimately you want to get rid
+
+14
+00:01:45,300 --> 00:01:51,940
+of that panel you hover until you see the arrows, the left and right arrow, and
+
+15
+00:01:51,940 --> 00:01:58,259
+then right-click and say join areas and then it'll ask you which
+
+16
+00:01:58,259 --> 00:02:02,500
+direction you want to join. I want to join over in this direction so it gets
+
+17
+00:02:02,500 --> 00:02:06,420
+rid of that panel then.
+
diff --git a/015000_20250219_1331 - resetting scale, rotation and origin location/015000_20250219_1331 - resetting scale, rotation and origin location.srt b/015000_20250219_1331 - resetting scale, rotation and origin location/015000_20250219_1331 - resetting scale, rotation and origin location.srt
new file mode 100644
index 0000000..b15cd51
--- /dev/null
+++ b/015000_20250219_1331 - resetting scale, rotation and origin location/015000_20250219_1331 - resetting scale, rotation and origin location.srt
@@ -0,0 +1,84 @@
+1
+00:00:00,000 --> 00:00:06,360
+So if I select this geometry like before with you know rotated in space
+
+2
+00:00:07,600 --> 00:00:12,840
+We can scale it. We type in S. We scale it and you see it changes there
+
+3
+00:00:15,400 --> 00:00:18,120
+If you would like to keep this geometry
+
+4
+00:00:19,240 --> 00:00:24,880
+in the same place, but reset the rotation or the local rotation and
+
+5
+00:00:25,680 --> 00:00:31,919
+Reset the scale you can do that up here under object and apply so first we're gonna
+
+6
+00:00:32,640 --> 00:00:38,720
+Switch the location and it's gonna reset the XYZ to zero zero zero as you can see there
+
+7
+00:00:39,440 --> 00:00:41,440
+And we can do that
+
+8
+00:00:41,560 --> 00:00:43,480
+for rotation
+
+9
+00:00:43,480 --> 00:00:48,239
+you can see our little gimbal is going to change down there to it goes to zero and
+
+10
+00:00:48,879 --> 00:00:50,879
+then ultimately we can
+
+11
+00:00:51,880 --> 00:00:56,080
+Apply the scale to and so now the scale goes to one one one
+
+12
+00:00:57,720 --> 00:01:01,960
+There's various reasons to do all this on the blender side
+
+13
+00:01:02,920 --> 00:01:05,600
+won't necessarily probably get into that but
+
+14
+00:01:06,640 --> 00:01:14,320
+Resetting it to one is important when you get into bonsai because you can't convert a blender object to an IC
+
+15
+00:01:14,679 --> 00:01:16,839
+Object if it has a scale
+
+16
+00:01:17,240 --> 00:01:23,559
+You know greater or less than one it has to be reset to one so this is one way to do it
+
+17
+00:01:25,440 --> 00:01:27,440
+If in
+
+18
+00:01:27,639 --> 00:01:29,559
+bonsai
+
+19
+00:01:29,559 --> 00:01:36,639
+Once we get there the suggested way to scale something is not with this but to enter into
+
+20
+00:01:37,359 --> 00:01:43,500
+Edit mode use your tab into edit mode and then select your geometry and then scale from there
+
+21
+00:01:44,320 --> 00:01:50,960
+That way when you exit out then into object mode your scale here is still one
+
diff --git a/016000_20250219_1425 - Handy quick keys and a few gotchas/016000_20250219_1425 - Handy quick keys and a few gotchas.srt b/016000_20250219_1425 - Handy quick keys and a few gotchas/016000_20250219_1425 - Handy quick keys and a few gotchas.srt
new file mode 100644
index 0000000..40dcfae
--- /dev/null
+++ b/016000_20250219_1425 - Handy quick keys and a few gotchas/016000_20250219_1425 - Handy quick keys and a few gotchas.srt
@@ -0,0 +1,84 @@
+1
+00:00:00,000 --> 00:00:08,480
+So as you probably guessed, the eyeball here in the outliner allows you to turn on and off the various geometries.
+
+2
+00:00:08,480 --> 00:00:20,880
+If you shift-select the eyeball of a collection, it turns all the objects on and off inside the collection, which is kind of useful.
+
+3
+00:00:21,840 --> 00:00:27,759
+The camera here, if you turn that off, it doesn't do anything in the scene, but
+
+4
+00:00:29,560 --> 00:00:35,460
+that turns off the object in the rendering, so it won't render that particular object.
+
+5
+00:00:35,640 --> 00:00:42,960
+So that's useful if you have something complicated that's kind of bogging the rendering down. You can turn that off in that way.
+
+6
+00:00:44,879 --> 00:00:48,480
+A few other quick keys that come in handy.
+
+7
+00:00:51,760 --> 00:00:58,720
+This is actually a good example. I moved off a scene somehow and I don't know where my geometry is.
+
+8
+00:00:58,720 --> 00:01:07,600
+So you can select your geometry in the outliner and click the period key and it zooms into the actual geometry.
+
+9
+00:01:08,720 --> 00:01:17,120
+Another useful quick key is if your scene is very complicated and you're working on something and you just want to isolate that particular geometry,
+
+10
+00:01:17,360 --> 00:01:27,360
+you can do a forward slash on your num key and it turns off all the geometry around it and zooms into it.
+
+11
+00:01:27,360 --> 00:01:32,160
+And then if you do it again, it zooms out of it. It's very useful.
+
+12
+00:01:35,840 --> 00:01:46,000
+The other kind of gotcha too is when you zoom out really far, things start disappearing and that's because the clip plane is too short.
+
+13
+00:01:46,640 --> 00:01:51,840
+And to change that you do it here. Increase it. See more of the grid.
+
+14
+00:01:54,960 --> 00:01:57,040
+I'm just going to actually move this object
+
+15
+00:02:00,720 --> 00:02:03,039
+super far to demonstrate something.
+
+16
+00:02:05,280 --> 00:02:10,240
+So I move that way off into the distance and then I'm going to use the period key to zoom into it.
+
+17
+00:02:10,640 --> 00:02:18,400
+Okay, so I'm zooming out again and I want to move back to the other objects in space.
+
+18
+00:02:20,400 --> 00:02:23,280
+And I'm just trying to zoom in with my mouse wheel.
+
+19
+00:02:25,040 --> 00:02:32,720
+And you'll find at a point, it's really weird, this is unique to Blender, is when you're zooming into something it just doesn't go anymore.
+
+20
+00:02:33,440 --> 00:02:43,040
+If you find that happens, to kind of reset that zoom, you just hit the period key on your numpad and it goes to that geometry.
+
+21
+00:02:43,040 --> 00:02:47,920
+So that can be frustrating to new users.
+
diff --git a/017000_20250219_1527 - Overview of Modifiers/017000_20250219_1527 - Overview of Modifiers.srt b/017000_20250219_1527 - Overview of Modifiers/017000_20250219_1527 - Overview of Modifiers.srt
new file mode 100644
index 0000000..d496187
--- /dev/null
+++ b/017000_20250219_1527 - Overview of Modifiers/017000_20250219_1527 - Overview of Modifiers.srt
@@ -0,0 +1,108 @@
+1
+00:00:00,000 --> 00:00:07,880
+So getting into Blender modifiers, they are a number of non-destructive tools
+
+2
+00:00:07,880 --> 00:00:16,800
+that allow you to make transformations and effects, various effects, on an object
+
+3
+00:00:16,800 --> 00:00:22,280
+without destroying its underlying geometry. So for example a Boolean
+
+4
+00:00:22,280 --> 00:00:28,920
+operator you could combine two objects together in an intersection and it
+
+5
+00:00:28,920 --> 00:00:33,880
+creates just one object and then if you turn that off the modifier it goes back
+
+6
+00:00:33,880 --> 00:00:39,360
+to two objects. I'm not going to go into all the modifiers that Blender has.
+
+7
+00:00:39,360 --> 00:00:44,560
+There's a ton of them but just to show you a few of them and kind of where
+
+8
+00:00:44,560 --> 00:00:50,120
+they're at and how to use them on a high level. So I'm just going to delete these
+
+9
+00:00:50,120 --> 00:00:58,480
+collection instances and turn off x-ray and turn on wireframe just so it's a
+
+10
+00:00:58,480 --> 00:01:05,440
+little easier to see. To do the modifiers you go to this icon here, click a
+
+11
+00:01:05,440 --> 00:01:12,360
+modifier, and these are the various folders of the various modifiers. I'm
+
+12
+00:01:12,360 --> 00:01:18,440
+just going to show an array. It's used quite often in other programs I'm sure
+
+13
+00:01:18,440 --> 00:01:25,520
+if you used. I can set the count and the distance. They're apart from each other
+
+14
+00:01:25,520 --> 00:01:35,920
+and various other variables here. You can turn off the modifier to see the
+
+15
+00:01:35,920 --> 00:01:40,759
+original geometry and turn it on or if you just like to actually remove the
+
+16
+00:01:40,759 --> 00:01:51,240
+modifier and keep that geometry you can apply it. I'm gonna undo that. You
+
+17
+00:01:51,240 --> 00:02:00,320
+can also add another modifier on top of this modifier as many as you want. I'm
+
+18
+00:02:00,320 --> 00:02:05,679
+gonna add a disseminate modifier. Disseminate is nice when you have
+
+19
+00:02:05,679 --> 00:02:11,160
+geometry that's highly faceted, lots of triangles, and you want to simplify it.
+
+20
+00:02:11,160 --> 00:02:17,480
+You can bring down the triangulation as you can see it's getting reduced there.
+
+21
+00:02:17,480 --> 00:02:25,160
+You can also change the order of modifiers. These particular ones there
+
+22
+00:02:25,160 --> 00:02:29,959
+you don't see much difference but sometimes the the order makes a
+
+23
+00:02:29,959 --> 00:02:39,720
+difference. So again you can apply and apply now that geometry is in the file.
+
+24
+00:02:39,720 --> 00:02:47,200
+The one thing when we get into Bonsai is unfortunately when you save an IFC file
+
+25
+00:02:47,239 --> 00:02:55,839
+with Bonsai it doesn't save these blender modifiers. So when you you
+
+26
+00:02:55,839 --> 00:02:59,920
+ultimately have to apply or remove the modifiers to save the geometry into the
+
+27
+00:02:59,920 --> 00:03:04,560
+IFC file but we'll cross that bridge later.
+
diff --git a/018000_20250219_1559 - Adding new geometry - Meshes and Curves/018000_20250219_1559 - Adding new geometry - Meshes and Curves.srt b/018000_20250219_1559 - Adding new geometry - Meshes and Curves/018000_20250219_1559 - Adding new geometry - Meshes and Curves.srt
new file mode 100644
index 0000000..e0f1c4a
--- /dev/null
+++ b/018000_20250219_1559 - Adding new geometry - Meshes and Curves/018000_20250219_1559 - Adding new geometry - Meshes and Curves.srt
@@ -0,0 +1,84 @@
+1
+00:00:00,000 --> 00:00:05,920
+So to add new geometry to the scene you first locate your 3D cursor where you
+
+2
+00:00:05,920 --> 00:00:13,160
+want to create the geometry. Go up to your to add. We'll start with the mesh.
+
+3
+00:00:13,160 --> 00:00:20,680
+Create a circle. Zoom in there. First time you do it it'll have this little
+
+4
+00:00:20,680 --> 00:00:25,100
+dialog box depending on the geometry where you can change the various
+
+5
+00:00:25,100 --> 00:00:31,220
+parameters of it. Unfortunately though once you click off of it you're no
+
+6
+00:00:31,220 --> 00:00:35,260
+longer able to bring up that dialog box again and it's just kind of dumb
+
+7
+00:00:35,260 --> 00:00:45,020
+geometry. I won't go into the rest. These are pretty self-explanatory.
+
+8
+00:00:45,020 --> 00:00:50,780
+So here curves or splines. There's basically there's three different
+
+9
+00:00:50,980 --> 00:00:56,380
+splines. There's the bezier and then there's the NURB curve and then there's
+
+10
+00:00:56,380 --> 00:01:03,940
+a poly curve which I'll show you. We'll start with bezier first. If you tab into
+
+11
+00:01:03,940 --> 00:01:10,300
+it you can see the bezier curve has these handles that you can modify to
+
+12
+00:01:10,300 --> 00:01:20,580
+change kind of how smooth or sharp the spline is. And just like a mesh
+
+13
+00:01:20,580 --> 00:01:29,380
+line you can add new subdivisions. So it created another point there. You can
+
+14
+00:01:29,380 --> 00:01:37,780
+right-click on it and change the handle type. Automatic is smooth. Vectors is a
+
+15
+00:01:37,780 --> 00:01:44,740
+sharper corner. I won't go into these others. They're just basically how smooth
+
+16
+00:01:44,740 --> 00:02:03,699
+or sharp the handle is. The NURB curves have different types of handles
+
+17
+00:02:03,699 --> 00:02:13,019
+which I found a little harder to navigate but it might be helpful for you.
+
+18
+00:02:14,740 --> 00:02:25,580
+Then the third type of spline is called the poly. You actually can't create it
+
+19
+00:02:25,580 --> 00:02:32,540
+from here I don't think. You actually have to convert an existing spline. So
+
+20
+00:02:32,540 --> 00:02:39,780
+we'll just duplicate that and hit edit mode and right-click on it and convert
+
+21
+00:02:39,780 --> 00:02:49,420
+to poly. Poly is just basically hard angles straight segments essentially.
+
diff --git a/018500_20250220_0824 - Extruding a profile along a path/018500_20250220_0824 - Extruding a profile along a path.srt b/018500_20250220_0824 - Extruding a profile along a path/018500_20250220_0824 - Extruding a profile along a path.srt
new file mode 100644
index 0000000..6d8a193
--- /dev/null
+++ b/018500_20250220_0824 - Extruding a profile along a path/018500_20250220_0824 - Extruding a profile along a path.srt
@@ -0,0 +1,116 @@
+1
+00:00:00,000 --> 00:00:05,800
+So you can extrude a profile along a path.
+
+2
+00:00:05,800 --> 00:00:09,200
+To make kind of an extruded path.
+
+3
+00:00:09,200 --> 00:00:16,400
+Both the path and the profile however need to be curves.
+
+4
+00:00:16,400 --> 00:00:21,000
+And so before I do this I'm going to convert this mesh here to a curve.
+
+5
+00:00:21,000 --> 00:00:24,500
+I'm going to tab into it and scale it down a little bit.
+
+6
+00:00:24,500 --> 00:00:28,500
+And then you pick the path.
+
+7
+00:00:28,500 --> 00:00:30,200
+Go to this tool.
+
+8
+00:00:30,200 --> 00:00:31,700
+Data tab there.
+
+9
+00:00:31,700 --> 00:00:32,800
+And then geometry.
+
+10
+00:00:32,800 --> 00:00:34,500
+And object.
+
+11
+00:00:34,500 --> 00:00:36,500
+And then pick the profile.
+
+12
+00:00:36,500 --> 00:00:42,000
+You can see it extrudes it where it's kind of tapered down at the corner there.
+
+13
+00:00:42,000 --> 00:00:45,000
+To correct that go to 2D.
+
+14
+00:00:45,000 --> 00:00:49,500
+And then you can actually fill the end caps.
+
+15
+00:00:49,500 --> 00:00:51,500
+There you go.
+
+16
+00:00:51,500 --> 00:00:57,500
+And it's not destructive where you can tab into it and change the profile.
+
+17
+00:00:58,500 --> 00:01:03,500
+And you can again change the spline type.
+
+18
+00:01:03,500 --> 00:01:06,500
+If you'd like.
+
+19
+00:01:09,500 --> 00:01:13,500
+I'll do this here. Same thing.
+
+20
+00:01:17,500 --> 00:01:22,500
+And you can actually change the profile after the fact too.
+
+21
+00:01:23,500 --> 00:01:28,500
+And then it changes the extrusions dynamically.
+
+22
+00:01:29,500 --> 00:01:32,500
+So unfortunately the...
+
+23
+00:01:32,500 --> 00:01:39,500
+There's no... When we get into Bonsai there's no tools that do this intelligently and save it into the IFC file.
+
+24
+00:01:39,500 --> 00:01:43,500
+So if you need to create a geometry like this you would use these Blender tools.
+
+25
+00:01:43,500 --> 00:01:48,500
+And then you would ultimately convert it to a mesh.
+
+26
+00:01:48,500 --> 00:01:50,500
+So it's dumb geometry now.
+
+27
+00:01:50,500 --> 00:01:53,500
+And then you would save it back into the IFC file.
+
+28
+00:01:53,500 --> 00:01:57,500
+I think the functionality to do this though is getting pretty close.
+
+29
+00:01:57,500 --> 00:02:03,500
+So I imagine it being there in the future but not currently.
+
diff --git a/019000_20250219_1711 - Adding Text and Images on Planes/019000_20250219_1711 - Adding Text and Images on Planes.srt b/019000_20250219_1711 - Adding Text and Images on Planes/019000_20250219_1711 - Adding Text and Images on Planes.srt
new file mode 100644
index 0000000..7b3bc90
--- /dev/null
+++ b/019000_20250219_1711 - Adding Text and Images on Planes/019000_20250219_1711 - Adding Text and Images on Planes.srt
@@ -0,0 +1,180 @@
+1
+00:00:00,000 --> 00:00:04,000
+You can add three-dimensional text to the scene.
+
+2
+00:00:04,000 --> 00:00:08,000
+Here, go to Text.
+
+3
+00:00:08,000 --> 00:00:12,000
+And to scale, just do S like you do
+
+4
+00:00:12,000 --> 00:00:16,000
+a normal object.
+
+5
+00:00:16,000 --> 00:00:20,000
+To edit the text, you tab into it.
+
+6
+00:00:20,000 --> 00:00:24,000
+Just type away.
+
+7
+00:00:24,000 --> 00:00:28,000
+You can also
+
+8
+00:00:28,000 --> 00:00:32,000
+change these variables.
+
+9
+00:00:32,000 --> 00:00:36,000
+For example, you can give an extrusion.
+
+10
+00:00:36,000 --> 00:00:40,000
+I won't go
+
+11
+00:00:40,000 --> 00:00:44,000
+into all of these, but you can now change the font size.
+
+12
+00:00:44,000 --> 00:00:48,000
+Then if you'd like to, once we get into Bonsai,
+
+13
+00:00:48,000 --> 00:00:52,000
+save this text into the .ic file. You'd have to convert it to
+
+14
+00:00:52,000 --> 00:00:56,000
+a mesh first. To do that, right-click and convert to mesh.
+
+15
+00:00:56,000 --> 00:01:00,000
+Then it's just dumb geometry.
+
+16
+00:01:00,000 --> 00:01:04,000
+You can also
+
+17
+00:01:04,000 --> 00:01:08,000
+add
+
+18
+00:01:08,000 --> 00:01:12,000
+images on planes, essentially.
+
+19
+00:01:12,000 --> 00:01:16,000
+I'm not quite sure the difference between reference and background.
+
+20
+00:01:16,000 --> 00:01:20,000
+I know both of them do not render
+
+21
+00:01:20,000 --> 00:01:24,000
+out when you render out a raster image.
+
+22
+00:01:24,000 --> 00:01:28,000
+But the mesh plane does render that out.
+
+23
+00:01:28,000 --> 00:01:32,000
+So I'll just start with a reference.
+
+24
+00:01:32,000 --> 00:01:36,000
+I'll ask you where the jpg is.
+
+25
+00:01:36,000 --> 00:01:40,000
+Let me undo that, go into the top view.
+
+26
+00:01:40,000 --> 00:01:44,000
+I'll do that again.
+
+27
+00:01:44,000 --> 00:01:48,000
+Okay, rotate it.
+
+28
+00:01:48,000 --> 00:01:52,000
+90 negative. And you can scale it
+
+29
+00:01:52,000 --> 00:01:56,000
+with S or these handles are kind of nice to
+
+30
+00:01:56,000 --> 00:02:00,000
+scale them dynamically.
+
+31
+00:02:00,000 --> 00:02:04,000
+You can change the actual linked
+
+32
+00:02:04,000 --> 00:02:08,000
+image here if you want.
+
+33
+00:02:08,000 --> 00:02:12,000
+And you can kind of mess with these parameters.
+
+34
+00:02:12,000 --> 00:02:16,000
+I think it shows, pushes the image
+
+35
+00:02:16,000 --> 00:02:20,000
+behind any geometry.
+
+36
+00:02:20,000 --> 00:02:24,000
+We'll go in all these here.
+
+37
+00:02:24,000 --> 00:02:28,000
+You can also add
+
+38
+00:02:28,000 --> 00:02:32,000
+mesh plane.
+
+39
+00:02:32,000 --> 00:02:36,000
+Move that out of the way.
+
+40
+00:02:36,000 --> 00:02:40,000
+And to see this, you have to turn on material preview up here.
+
+41
+00:02:40,000 --> 00:02:44,000
+You can see that.
+
+42
+00:02:44,000 --> 00:02:48,000
+Scale as well.
+
+43
+00:02:48,000 --> 00:02:52,000
+And then to change this if you want to after the fact,
+
+44
+00:02:52,000 --> 00:02:56,000
+you would go to shading here. And I can show,
+
+45
+00:02:56,000 --> 00:03:00,000
+I'll cover this more later, but you would change this node here.
+
diff --git a/020000_20250220_0924 - Adding Lights/020000_20250220_0924 - Adding Lights.srt b/020000_20250220_0924 - Adding Lights/020000_20250220_0924 - Adding Lights.srt
new file mode 100644
index 0000000..629c865
--- /dev/null
+++ b/020000_20250220_0924 - Adding Lights/020000_20250220_0924 - Adding Lights.srt
@@ -0,0 +1,116 @@
+1
+00:00:00,000 --> 00:00:04,760
+You can add lights to the scene. Locate your 3D cursor.
+
+2
+00:00:04,760 --> 00:00:08,960
+Add light. There's four different lights.
+
+3
+00:00:08,960 --> 00:00:12,560
+Point, sun, spot and area. We'll do point first.
+
+4
+00:00:12,560 --> 00:00:15,440
+Move it up a little bit.
+
+5
+00:00:15,440 --> 00:00:20,240
+In order to see the effects of it you'd have to change the viewport shading to
+
+6
+00:00:20,240 --> 00:00:23,800
+rendered mode there.
+
+7
+00:00:23,800 --> 00:00:27,640
+We can increase the power of it. It's more evident.
+
+8
+00:00:28,640 --> 00:00:32,360
+I won't go through all these settings
+
+9
+00:00:32,360 --> 00:00:35,760
+but for the most part you can kind of play around with them to see
+
+10
+00:00:35,760 --> 00:00:39,560
+ultimately what they do. Obviously turning on and off shadows.
+
+11
+00:00:39,560 --> 00:00:43,000
+You can mess with this to
+
+12
+00:00:43,000 --> 00:00:46,280
+change how crisp the shadow is
+
+13
+00:00:46,280 --> 00:00:50,880
+relative to the geometry. There's fall off.
+
+14
+00:00:50,880 --> 00:00:54,160
+That just changes the intensity of how quickly
+
+15
+00:00:54,239 --> 00:00:58,239
+the light intensity changes.
+
+16
+00:00:58,239 --> 00:01:02,559
+I won't go under these parameters. You can actually change then.
+
+17
+00:01:02,559 --> 00:01:06,039
+Here's the four lights. You can switch it to sun.
+
+18
+00:01:06,039 --> 00:01:11,160
+Sun as you can imagine is this light source that's
+
+19
+00:01:11,160 --> 00:01:15,000
+up in the sky infinite distance and the
+
+20
+00:01:15,000 --> 00:01:20,199
+light rays come out at a consistent angle. So if you
+
+21
+00:01:20,199 --> 00:01:23,800
+change the angle you can see the shadows changing.
+
+22
+00:01:24,240 --> 00:01:31,240
+If you move it it actually still keeps the angle of the sun.
+
+23
+00:01:31,240 --> 00:01:34,240
+Same position.
+
+24
+00:01:34,240 --> 00:01:38,240
+I can switch to spot.
+
+25
+00:01:38,240 --> 00:01:41,640
+Move around. Again adjust the
+
+26
+00:01:41,640 --> 00:01:44,759
+size of it. Angle.
+
+27
+00:01:44,759 --> 00:01:47,759
+Then area.
+
+28
+00:01:47,759 --> 00:01:52,360
+Again you can just kind of play around with these parameters.
+
+29
+00:01:52,360 --> 00:01:55,360
+Dangle.
+
diff --git a/021000_20250220_1221 - Adding Cameras/021000_20250220_1221 - Adding Cameras.srt b/021000_20250220_1221 - Adding Cameras/021000_20250220_1221 - Adding Cameras.srt
new file mode 100644
index 0000000..3ccfd20
--- /dev/null
+++ b/021000_20250220_1221 - Adding Cameras/021000_20250220_1221 - Adding Cameras.srt
@@ -0,0 +1,136 @@
+1
+00:00:00,000 --> 00:00:04,960
+To add a camera in World, you select your 3D cursor where you'd like to place it.
+
+2
+00:00:04,960 --> 00:00:13,000
+Go to Add and Camera. This acts just like any other Blender object where you can
+
+3
+00:00:13,000 --> 00:00:20,800
+kind of move it up and down or rotate it. In order to see what that camera is
+
+4
+00:00:20,800 --> 00:00:26,800
+looking at, you type 0 on your num keypad and it goes basically into that view.
+
+5
+00:00:26,800 --> 00:00:35,760
+From here, if you use your middle mouse button and rotate out, it pulls
+
+6
+00:00:35,760 --> 00:00:41,920
+out of that view again. If you want to get back into it, you type 0 again.
+
+7
+00:00:41,920 --> 00:00:47,800
+Let's say you're in the view here and you want to navigate or change the view.
+
+8
+00:00:47,800 --> 00:00:54,120
+There's two ways you can do it. One way is to lock the camera to the view.
+
+9
+00:00:54,120 --> 00:00:58,800
+Now when you use your mouse button and zoom in and out and rotate and pan and whatnot,
+
+10
+00:00:58,800 --> 00:01:05,399
+it actually keeps that view locked. That's one way. The other way, which I
+
+11
+00:01:05,399 --> 00:01:14,160
+kind of like doing, is to use Shift Tilde and now you can use your gamer keys, your
+
+12
+00:01:14,160 --> 00:01:22,640
+WASD keys, to move around to get the view that you'd like. Other things you can
+
+13
+00:01:22,640 --> 00:01:30,480
+change with cameras, you can switch it to orthographic or perspective. I don't use
+
+14
+00:01:30,480 --> 00:01:37,400
+panoramic much. You can change the focal length there. I don't use these very
+
+15
+00:01:37,400 --> 00:01:44,840
+often. Clip plane, kind of self-explanatory. Let's change that to 10 and
+
+16
+00:01:44,840 --> 00:01:54,120
+you increase it or the front clip plane too. You can change that as well. If you
+
+17
+00:01:54,120 --> 00:02:01,160
+say you have two cameras, I'm going to duplicate this one, and if I
+
+18
+00:02:01,160 --> 00:02:07,320
+press 0, it's going back to the original camera or the old camera even though this
+
+19
+00:02:07,320 --> 00:02:12,680
+one is selected. You can see that. If you want to actually see what this is
+
+20
+00:02:12,680 --> 00:02:20,880
+looking at, you do Ctrl 0 on your numpad and it goes to that view.
+
+21
+00:02:20,880 --> 00:02:29,360
+Again, if you want to switch over here, Ctrl 0. The other settings that
+
+22
+00:02:29,360 --> 00:02:35,120
+are important with cameras are found under here, the output, and you can
+
+23
+00:02:35,120 --> 00:02:40,720
+actually change the aspect ratio of that rectangle. That corresponds to
+
+24
+00:02:40,720 --> 00:02:46,880
+basically when you do your renderings, what the DPI output is going to be.
+
+25
+00:02:48,520 --> 00:02:56,280
+I can do a quick render here just to show that's the view. Let me duplicate
+
+26
+00:02:56,280 --> 00:03:02,600
+something. Before when I said if you could use this camera here and turn it
+
+27
+00:03:02,600 --> 00:03:07,680
+off, that won't render that object in the scene. So we did that.
+
+28
+00:03:07,680 --> 00:03:15,280
+Let's see. You can see it doesn't render. That's something to know about.
+
+29
+00:03:15,280 --> 00:03:21,120
+Cameras are good to know functionality in Blender because cameras are what
+
+30
+00:03:21,120 --> 00:03:28,320
+Bonsai uses to create their various drawing views. Once you're familiar
+
+31
+00:03:28,320 --> 00:03:32,760
+with how these cameras work, the drawings will make more sense when we
+
+32
+00:03:32,760 --> 00:03:37,240
+get into Bonsai. Actually, there's a whole different kind of interface for
+
+33
+00:03:37,240 --> 00:03:45,600
+drawings that I rarely use to actually use Blender's camera anymore after
+
+34
+00:03:45,600 --> 00:03:49,080
+getting into Bonsai.
+
diff --git a/022000_20250220_1310 - Adding Empties/022000_20250220_1310 - Adding Empties.srt b/022000_20250220_1310 - Adding Empties/022000_20250220_1310 - Adding Empties.srt
new file mode 100644
index 0000000..d81716d
--- /dev/null
+++ b/022000_20250220_1310 - Adding Empties/022000_20250220_1310 - Adding Empties.srt
@@ -0,0 +1,60 @@
+1
+00:00:00,000 --> 00:00:04,520
+Another object that's worth knowing about in Blender and is used quite a bit
+
+2
+00:00:04,520 --> 00:00:13,240
+are called empties. You can find those under here. Empties are basically empty.
+
+3
+00:00:13,240 --> 00:00:20,200
+They don't have any geometry but they're a way to hold various data or
+
+4
+00:00:20,200 --> 00:00:25,060
+information in the model. It's used in Blender in a number of ways you can
+
+5
+00:00:25,060 --> 00:00:32,180
+use to drive certain objects to move together and in animations as well which
+
+6
+00:00:32,180 --> 00:00:39,500
+I won't get into but they're very useful when we get into Bonsai to carry
+
+7
+00:00:39,500 --> 00:00:48,739
+information such as they assign it to an IFC building or IFC site or an IFC
+
+8
+00:00:48,740 --> 00:00:55,340
+aggregate. You can assign various P sets or properties to it or
+
+9
+00:00:55,340 --> 00:01:01,820
+quantity sets. I can just give you a little sneak peek into Blender or
+
+10
+00:01:01,820 --> 00:01:09,420
+Bonsai rather and you can see here the empties are used for you know IFC site
+
+11
+00:01:09,420 --> 00:01:15,460
+and IFC building. Over here you can see the various information or data
+
+12
+00:01:15,460 --> 00:01:22,139
+attached to that such as the name or description of the story the various P
+
+13
+00:01:22,139 --> 00:01:28,500
+sets that are connected to that and also the quantity sets the quantity take off
+
+14
+00:01:28,500 --> 00:01:36,339
+as well and for like assemblies same thing you can just attach different data
+
+15
+00:01:36,339 --> 00:01:43,580
+to them so they are quite handy once we get into Bonsai.
+
diff --git a/023000_20250220_1356 - relinking missing assets/023000_20250220_1356 - relinking missing assets.srt b/023000_20250220_1356 - relinking missing assets/023000_20250220_1356 - relinking missing assets.srt
new file mode 100644
index 0000000..b353c67
--- /dev/null
+++ b/023000_20250220_1356 - relinking missing assets/023000_20250220_1356 - relinking missing assets.srt
@@ -0,0 +1,32 @@
+1
+00:00:00,000 --> 00:00:11,960
+You'll find out sometimes when you open a file anew that the jpgs and our materials
+
+2
+00:00:11,960 --> 00:00:18,800
+or textures that are applied to certain objects go missing and you can tell that they're missing
+
+3
+00:00:18,800 --> 00:00:22,600
+because of this magenta color that's attached to it.
+
+4
+00:00:22,600 --> 00:00:29,720
+So if that ever happens there's a relatively quick way to remind Blender where to look
+
+5
+00:00:29,840 --> 00:00:37,200
+for those assets and that's under external data find missing files and then navigate
+
+6
+00:00:37,200 --> 00:00:44,840
+to where the folder where those assets are and then just find missing files and it should
+
+7
+00:00:44,840 --> 00:00:50,640
+make all those connections apparent again.
+
+8
+00:00:50,640 --> 00:00:55,400
+And then so when you save the file hopefully the path is remembered next time.
+
diff --git a/024000_20250220_1526 - Prep work before adding Materials/024000_20250220_1526 - Prep work before adding Materials.srt b/024000_20250220_1526 - Prep work before adding Materials/024000_20250220_1526 - Prep work before adding Materials.srt
new file mode 100644
index 0000000..86be6bf
--- /dev/null
+++ b/024000_20250220_1526 - Prep work before adding Materials/024000_20250220_1526 - Prep work before adding Materials.srt
@@ -0,0 +1,124 @@
+1
+00:00:00,000 --> 00:00:02,800
+So to help simplify the scene,
+
+2
+00:00:02,800 --> 00:00:05,560
+I'm going to clean a couple of few things up here.
+
+3
+00:00:05,560 --> 00:00:09,760
+I'm going to select that and shift select this,
+
+4
+00:00:09,760 --> 00:00:13,360
+that and the light.
+
+5
+00:00:13,360 --> 00:00:15,520
+I'm going to do control I,
+
+6
+00:00:15,520 --> 00:00:18,500
+that inverses the selection and I'm going to delete.
+
+7
+00:00:18,500 --> 00:00:20,600
+So we have a camera in there,
+
+8
+00:00:20,600 --> 00:00:25,520
+light, some geometry in these planes.
+
+9
+00:00:26,520 --> 00:00:29,580
+So let's say you have something like this where it's
+
+10
+00:00:29,659 --> 00:00:34,580
+one object, but you want to separate all these out.
+
+11
+00:00:34,580 --> 00:00:39,300
+All these kind of individual meshes into their own object.
+
+12
+00:00:39,300 --> 00:00:42,099
+One quick way to do that is to select it,
+
+13
+00:00:42,099 --> 00:00:50,300
+tab into it and then go to mesh here and separate out by loose parts.
+
+14
+00:00:50,300 --> 00:00:51,300
+Oops.
+
+15
+00:00:51,300 --> 00:00:54,340
+Right by those parts.
+
+16
+00:00:54,340 --> 00:00:59,060
+That actually creates individual objects like this.
+
+17
+00:00:59,580 --> 00:01:02,580
+And I'm going to turn on the rendered view here.
+
+18
+00:01:02,580 --> 00:01:06,580
+Select the light and I'm going to switch that to a sun.
+
+19
+00:01:06,580 --> 00:01:10,580
+Tone down the brightness a little bit.
+
+20
+00:01:13,580 --> 00:01:17,580
+Let's see here, select the camera type zero.
+
+21
+00:01:17,580 --> 00:01:23,580
+Can shift tilde and I'm going to move around a little bit so I can see the scene.
+
+22
+00:01:23,580 --> 00:01:26,580
+The view.
+
+23
+00:01:26,580 --> 00:01:29,580
+Which here.
+
+24
+00:01:32,580 --> 00:01:35,580
+Crease the clip line there.
+
+25
+00:01:39,580 --> 00:01:45,580
+And let's just change the aspect ratio to shift tilde.
+
+26
+00:01:45,580 --> 00:01:49,580
+I'm going to move back out so I can kind of see everything.
+
+27
+00:01:54,580 --> 00:01:56,580
+And pull out of that.
+
+28
+00:01:56,580 --> 00:01:59,580
+I'm going to delete these.
+
+29
+00:02:00,580 --> 00:02:08,579
+And then select these and tab into them and scale them up to a larger scale.
+
+30
+00:02:10,579 --> 00:02:18,579
+All this is prep work essentially for the fun thing that we're going to do next.
+
+31
+00:02:18,580 --> 00:02:24,580
+Which is to add materials to various objects.
+
diff --git a/025000_20250220_1549 - Overview of a Material/025000_20250220_1549 - Overview of a Material.srt b/025000_20250220_1549 - Overview of a Material/025000_20250220_1549 - Overview of a Material.srt
new file mode 100644
index 0000000..99292d5
--- /dev/null
+++ b/025000_20250220_1549 - Overview of a Material/025000_20250220_1549 - Overview of a Material.srt
@@ -0,0 +1,116 @@
+1
+00:00:00,000 --> 00:00:05,080
+Okay, now we can create materials and start applying them to objects.
+
+2
+00:00:05,080 --> 00:00:09,680
+So to do that, we're going to go to a different workspace, the shading workspace here.
+
+3
+00:00:09,680 --> 00:00:15,040
+And I'm going to zoom out, change that to rendered view.
+
+4
+00:00:15,040 --> 00:00:26,040
+If you select an object and go to this tab, you can see that the default material called
+
+5
+00:00:26,040 --> 00:00:28,080
+material is applied to that object.
+
+6
+00:00:28,119 --> 00:00:29,919
+And you can remove that if you'd like.
+
+7
+00:00:29,919 --> 00:00:38,200
+To create a new one, click on that and double click to rename, it's called test.
+
+8
+00:00:38,200 --> 00:00:46,040
+What that does, then when you create a new material, it creates these two default nodes
+
+9
+00:00:46,040 --> 00:00:49,239
+in the shade editor, shader editor here.
+
+10
+00:00:50,240 --> 00:00:58,240
+This is kind of the foundation nodes that you're going to be able to apply other nodes
+
+11
+00:00:58,240 --> 00:01:01,160
+into to change the actual material.
+
+12
+00:01:01,160 --> 00:01:07,600
+So at its base, you can do quite a bit with just this node.
+
+13
+00:01:07,600 --> 00:01:13,440
+Obviously there's base color, which sets the main color of the surface.
+
+14
+00:01:13,440 --> 00:01:18,680
+There's metallic, which controls how much the surface behaves like metal.
+
+15
+00:01:19,680 --> 00:01:21,680
+You know, affecting its reflectivity.
+
+16
+00:01:22,880 --> 00:01:28,880
+We have roughness, which determines how sharp or blurry the reflections appear.
+
+17
+00:01:30,640 --> 00:01:37,920
+With lower values making it shiny, and then higher values can make it more matte feel.
+
+18
+00:01:38,960 --> 00:01:43,760
+And then IOR, which I rarely use, is called index reflection.
+
+19
+00:01:44,480 --> 00:01:48,320
+That basically controls how light bends and reflects through the surface.
+
+20
+00:01:49,600 --> 00:01:52,320
+And it affects transparency and shininess.
+
+21
+00:01:53,280 --> 00:01:59,360
+And then alpha here controls the transparency where the lower values
+
+22
+00:02:00,800 --> 00:02:02,320
+make the surface more see-through.
+
+23
+00:02:03,440 --> 00:02:12,800
+And then finally normal, it adjusts the surface details by influencing how light interacts
+
+24
+00:02:13,600 --> 00:02:16,240
+with the bumps and grooves of a texture.
+
+25
+00:02:17,080 --> 00:02:20,440
+And it really without really changing the actual geometry.
+
+26
+00:02:21,080 --> 00:02:24,040
+So I actually won't go into these remaining ones.
+
+27
+00:02:24,040 --> 00:02:32,280
+I rarely use those, but this is basically the foundation of a material.
+
+28
+00:02:33,160 --> 00:02:38,920
+This whole graph over the next number of videos is going to get added on to.
+
+29
+00:02:40,200 --> 00:02:41,080
+But this is the start.
+
diff --git a/026000_20250220_1621 - Changing the material values and adding a texture/026000_20250220_1621 - Changing the material values and adding a texture.srt b/026000_20250220_1621 - Changing the material values and adding a texture/026000_20250220_1621 - Changing the material values and adding a texture.srt
new file mode 100644
index 0000000..9644d47
--- /dev/null
+++ b/026000_20250220_1621 - Changing the material values and adding a texture/026000_20250220_1621 - Changing the material values and adding a texture.srt
@@ -0,0 +1,108 @@
+1
+00:00:00,000 --> 00:00:05,000
+So to see what these values do, the best is just to play around with them.
+
+2
+00:00:05,000 --> 00:00:08,000
+You click on that, you can change the color.
+
+3
+00:00:08,000 --> 00:00:12,000
+There's different modes of color change, as you can see here.
+
+4
+00:00:15,000 --> 00:00:20,000
+You can actually even use the eyedropper to pick up a color, if you'd like.
+
+5
+00:00:22,000 --> 00:00:24,000
+You can change the metallic there.
+
+6
+00:00:24,000 --> 00:00:30,000
+One nice thing to know about the UI trick, if you change a value and you don't like that,
+
+7
+00:00:30,000 --> 00:00:34,000
+and you want to go back to its default settings, you can hit the backspace.
+
+8
+00:00:34,000 --> 00:00:37,000
+It changes it to what it was before.
+
+9
+00:00:42,000 --> 00:00:44,000
+Backspace to change it back again.
+
+10
+00:00:44,000 --> 00:00:52,000
+So here we're obviously applying just a base color, but what if you want to apply a texture to your material?
+
+11
+00:00:52,000 --> 00:00:56,000
+Well, you would use the base color input node.
+
+12
+00:00:56,000 --> 00:01:01,000
+We need to add another node, however.
+
+13
+00:01:01,000 --> 00:01:07,000
+It's called image texture.
+
+14
+00:01:07,000 --> 00:01:12,000
+So you can use these dropdowns, or you can do a shift-A and search for it.
+
+15
+00:01:12,000 --> 00:01:13,000
+Image texture.
+
+16
+00:01:13,000 --> 00:01:16,000
+That's another node there.
+
+17
+00:01:16,000 --> 00:01:21,000
+And we're going to open and we're going to actually look for a texture.
+
+18
+00:01:21,000 --> 00:01:23,000
+So I added these textures previously.
+
+19
+00:01:23,000 --> 00:01:26,000
+So we'll just start with concrete.
+
+20
+00:01:27,000 --> 00:01:35,000
+And we're going to take this output node here and connect it to the input node there.
+
+21
+00:01:35,000 --> 00:01:38,000
+And it adds a beautiful texture.
+
+22
+00:01:42,000 --> 00:01:46,000
+For these various input values here, I typically keep it linear.
+
+23
+00:01:47,000 --> 00:01:51,000
+Depending on what I do, I either use box or flat.
+
+24
+00:01:51,000 --> 00:01:52,000
+I can change it.
+
+25
+00:01:52,000 --> 00:01:55,000
+You can see the difference on the projection there.
+
+26
+00:01:55,000 --> 00:01:58,000
+And then these remaining ones, I rarely change them.
+
+27
+00:02:00,000 --> 00:02:05,000
+And then we can change the name to concrete.
+
diff --git a/027000_20250220_1652 - Changing the textures scale/027000_20250220_1652 - Changing the textures scale.srt b/027000_20250220_1652 - Changing the textures scale/027000_20250220_1652 - Changing the textures scale.srt
new file mode 100644
index 0000000..a7dcc3e
--- /dev/null
+++ b/027000_20250220_1652 - Changing the textures scale/027000_20250220_1652 - Changing the textures scale.srt
@@ -0,0 +1,120 @@
+1
+00:00:00,000 --> 00:00:04,300
+We have the texture now applied to the material.
+
+2
+00:00:04,300 --> 00:00:07,720
+How do you scale it up or down?
+
+3
+00:00:07,720 --> 00:00:11,200
+To do that we'll need two more nodes.
+
+4
+00:00:11,200 --> 00:00:16,000
+First one is a mapping node.
+
+5
+00:00:16,000 --> 00:00:24,020
+The second one is a texture coordinate node.
+
+6
+00:00:24,020 --> 00:00:31,380
+To start take the vector output and connect it to the input there.
+
+7
+00:00:31,380 --> 00:00:33,900
+Change this to texture.
+
+8
+00:00:33,900 --> 00:00:40,140
+And then on the texture coordinate node we'll take object and put it in the vector.
+
+9
+00:00:40,140 --> 00:00:41,600
+I'm not going to cover these other ones.
+
+10
+00:00:41,600 --> 00:00:46,040
+You can kind of play with them as you wish.
+
+11
+00:00:46,040 --> 00:00:53,019
+For example if you go to use a camera and it actually maps the texture relative to the
+
+12
+00:00:53,020 --> 00:00:55,420
+camera and not the object.
+
+13
+00:00:55,420 --> 00:00:58,020
+So you can play around with those values.
+
+14
+00:00:58,020 --> 00:01:03,700
+Here you can see you can change the scale whether the X or Y or Z.
+
+15
+00:01:03,700 --> 00:01:12,280
+If you'd like to change all those together you can do another node called value.
+
+16
+00:01:12,280 --> 00:01:14,860
+Plug that in there.
+
+17
+00:01:14,860 --> 00:01:19,220
+Then you can change them all together at the same time.
+
+18
+00:01:19,220 --> 00:01:25,900
+You notice our texture is wrapped at 45 and that's because our origin is actually turned.
+
+19
+00:01:25,900 --> 00:01:31,980
+If you remember in some of our last videos we ended up resetting the origin.
+
+20
+00:01:31,980 --> 00:01:37,140
+I'm just going to quickly change that back.
+
+21
+00:01:37,140 --> 00:01:40,300
+Go to effects origin.
+
+22
+00:01:40,300 --> 00:01:41,300
+Where's our origin?
+
+23
+00:01:41,300 --> 00:01:42,300
+There's our origin.
+
+24
+00:01:42,300 --> 00:01:52,340
+Turn on move and locate it there.
+
+25
+00:01:52,340 --> 00:01:57,820
+And I'm just going to change it 45.
+
+26
+00:01:57,820 --> 00:02:04,020
+So the actual local axis is aligned with actual geometry.
+
+27
+00:02:04,020 --> 00:02:09,780
+And there you can see that texture aligns better now.
+
+28
+00:02:09,780 --> 00:02:16,420
+And then obviously you can change the rotation of the texture.
+
+29
+00:02:16,420 --> 00:02:23,700
+And then how it offsets from itself.
+
+30
+00:02:23,700 --> 00:02:26,299
+And again backspace if you want to reset that.
+
diff --git a/028000_20250220_1714 - Applying the texture correctly on all faces/028000_20250220_1714 - Applying the texture correctly on all faces.srt b/028000_20250220_1714 - Applying the texture correctly on all faces/028000_20250220_1714 - Applying the texture correctly on all faces.srt
new file mode 100644
index 0000000..5f5d98f
--- /dev/null
+++ b/028000_20250220_1714 - Applying the texture correctly on all faces/028000_20250220_1714 - Applying the texture correctly on all faces.srt
@@ -0,0 +1,68 @@
+1
+00:00:00,000 --> 00:00:07,000
+So our shading is a little dark. It's hard to see the texture here applied. I'm going to turn on some ambient light.
+
+2
+00:00:07,000 --> 00:00:13,000
+Turning that off. I won't fully explain that. Just know it exists for now.
+
+3
+00:00:13,000 --> 00:00:18,000
+I'm going to switch this to zero.
+
+4
+00:00:18,000 --> 00:00:23,000
+So you can see that our texture looks normal on top, but not on the sides.
+
+5
+00:00:24,000 --> 00:00:26,000
+We can fix that.
+
+6
+00:00:26,000 --> 00:00:31,000
+We need another node called a vector rotate node.
+
+7
+00:00:31,000 --> 00:00:37,000
+We're going to place it between our mapping node and our image texture here.
+
+8
+00:00:37,000 --> 00:00:45,000
+If you drag and drop it on the little noodle here, it should place it in between automatically.
+
+9
+00:00:46,000 --> 00:00:53,000
+Then we're going to take a normal from our texture coordinate and drag it into the axis here.
+
+10
+00:00:53,000 --> 00:00:58,000
+Don't worry about understanding that. I don't really know either.
+
+11
+00:00:58,000 --> 00:01:02,000
+It was learned from a lot of forum searches.
+
+12
+00:01:02,000 --> 00:01:12,000
+The nice thing about what we're doing here is once we have an overall graph set up, we can reuse this on other materials.
+
+13
+00:01:12,000 --> 00:01:16,000
+We don't have to go through this thought process anymore.
+
+14
+00:01:16,000 --> 00:01:19,000
+So that's kind of nice.
+
+15
+00:01:19,000 --> 00:01:24,000
+Then we switch this to box.
+
+16
+00:01:29,000 --> 00:01:36,000
+Then if we want to change the angle of the texture again, we can do it here.
+
+17
+00:01:36,000 --> 00:01:43,000
+Now the texture is applied correctly all around the cube.
+
diff --git a/029000_20250220_1826 - Adding other PBR textures to the Material/029000_20250220_1826 - Adding other PBR textures to the Material.srt b/029000_20250220_1826 - Adding other PBR textures to the Material/029000_20250220_1826 - Adding other PBR textures to the Material.srt
new file mode 100644
index 0000000..039c496
--- /dev/null
+++ b/029000_20250220_1826 - Adding other PBR textures to the Material/029000_20250220_1826 - Adding other PBR textures to the Material.srt
@@ -0,0 +1,172 @@
+1
+00:00:00,000 --> 00:00:07,560
+Similar to how we are feeding a texture into a base color, we can feed textures,
+
+2
+00:00:07,560 --> 00:00:12,900
+different types of textures, into these other values such as metallic roughness
+
+3
+00:00:12,900 --> 00:00:19,740
+and normal and some of these other ones as well. What those textures look like
+
+4
+00:00:19,740 --> 00:00:25,500
+are something like this, where this is actually the texture that we fed into
+
+5
+00:00:25,500 --> 00:00:30,259
+the base color here. But as you can see there's other ones ambient occlusion,
+
+6
+00:00:30,259 --> 00:00:35,820
+displacement, normals, and roughness that we can feed into those other values in
+
+7
+00:00:35,820 --> 00:00:43,300
+that principal base node. I don't know the technical details of why these
+
+8
+00:00:43,300 --> 00:00:50,140
+textures look the way they do, just know that they exist. There are a lot of
+
+9
+00:00:50,140 --> 00:00:57,540
+texture libraries out online where you can pick up these various textures. These
+
+10
+00:00:57,540 --> 00:01:03,620
+are three of my favorite, they're all open source textures. You can check them
+
+11
+00:01:03,620 --> 00:01:14,980
+out. So basically I downloaded a number of textures from one of those sites. So
+
+12
+00:01:14,980 --> 00:01:22,620
+if you go back to the site here, we're just basically going to duplicate these
+
+13
+00:01:22,620 --> 00:01:32,580
+nodes. It was shift D and we're gonna open the end panel and type end and we're
+
+14
+00:01:32,580 --> 00:01:40,980
+gonna rename this or label it called base color. We're gonna select this and
+
+15
+00:01:40,980 --> 00:01:53,180
+change it to metallic. Then I basically already created these nodes which I'm
+
+16
+00:01:53,180 --> 00:02:01,980
+just gonna bring up and I label them roughness displacement normals. So
+
+17
+00:02:01,980 --> 00:02:07,140
+what we do then is just for this texture since it's concrete we don't have
+
+18
+00:02:07,140 --> 00:02:13,980
+metallic but we can start with roughness and open navigate to where the
+
+19
+00:02:13,980 --> 00:02:23,220
+texture is and we're gonna use this roughness and we're going to connect the
+
+20
+00:02:23,220 --> 00:02:27,460
+noodle the roughness factor there.
+
+21
+00:02:30,820 --> 00:02:36,980
+Sorry I made a mistake. We need to take the color from the roughness and apply
+
+22
+00:02:36,980 --> 00:02:42,179
+it to the roughness. We don't have a texture for metallic for this particular
+
+23
+00:02:42,179 --> 00:02:48,140
+material. So for the normal plug-in here we're gonna actually combine two nodes
+
+24
+00:02:48,140 --> 00:02:53,339
+we're gonna combine displacement and normals and to do that we need two more
+
+25
+00:02:53,339 --> 00:03:05,780
+nodes. We'll do a normal map and then a bump. Then from the normals you feed that
+
+26
+00:03:05,780 --> 00:03:11,100
+into the color and then from the normal map you're into the normal on the bump
+
+27
+00:03:11,100 --> 00:03:15,580
+there and then from displacement take the color and feed it into the height
+
+28
+00:03:15,580 --> 00:03:24,500
+and then take the overall result and bring it up to the normal here. These
+
+29
+00:03:24,500 --> 00:03:30,300
+values again don't necessarily try to figure out what's going on. Go for it if
+
+30
+00:03:30,300 --> 00:03:35,180
+you want but these were basically established from again reading the
+
+31
+00:03:35,580 --> 00:03:40,300
+forums and you can just tweak these various values to see what ultimately
+
+32
+00:03:40,300 --> 00:03:45,380
+how it affects the the texture. So now that we kind of made all these
+
+33
+00:03:45,380 --> 00:03:54,820
+connections we have to connect the actual texture the correct texture.
+
+34
+00:03:54,820 --> 00:04:01,860
+This one is roughness add that. Oops sorry that was no I'm just gonna close
+
+35
+00:04:01,860 --> 00:04:10,100
+that. I need roughness here and displacement.
+
+36
+00:04:10,100 --> 00:04:22,180
+Displacements here and then normal here.
+
+37
+00:04:28,620 --> 00:04:35,700
+Of these two textures they're both normal I use the GL again that's from
+
+38
+00:04:35,700 --> 00:04:40,180
+research I think that's the best one.
+
+39
+00:04:44,180 --> 00:04:49,780
+So after assigning all these various textures to these new nodes that we just
+
+40
+00:04:49,780 --> 00:04:57,940
+created now we have to make sure to align their scale and also their
+
+41
+00:04:57,940 --> 00:05:09,940
+location and to do that we just pull off this and plug it into the vector
+
+42
+00:05:09,940 --> 00:05:21,980
+input. So you can see the bump map is pretty steep so we can adjust these
+
+43
+00:05:21,980 --> 00:05:31,700
+variables as you see fit to make it somewhat more realistic.
+
diff --git a/030000_20250221_1042 - Changing texture color and contrast/030000_20250221_1042 - Changing texture color and contrast.srt b/030000_20250221_1042 - Changing texture color and contrast/030000_20250221_1042 - Changing texture color and contrast.srt
new file mode 100644
index 0000000..6064ca8
--- /dev/null
+++ b/030000_20250221_1042 - Changing texture color and contrast/030000_20250221_1042 - Changing texture color and contrast.srt
@@ -0,0 +1,76 @@
+1
+00:00:00,000 --> 00:00:05,760
+Here's our concrete texture. What happens if we want to change its color
+
+2
+00:00:05,760 --> 00:00:12,640
+or its brightness or how dark it is? You don't necessarily have to go back to the
+
+3
+00:00:12,640 --> 00:00:18,880
+JPEG and change that color. There are tools you can actually or nodes you
+
+4
+00:00:18,880 --> 00:00:23,520
+can add to this graph that allows you to make those changes. I'll show you
+
+5
+00:00:23,680 --> 00:00:32,879
+just a couple. If you go under Add here, Color, you can use Hue Saturation Value.
+
+6
+00:00:34,320 --> 00:00:41,360
+And again place it on the noodle and it should insert it. This is between the base color
+
+7
+00:00:41,360 --> 00:00:47,120
+here and then the principal node. And again you can just kind of tweak these values.
+
+8
+00:00:54,480 --> 00:01:00,320
+Another good one that I use quite a bit. Oh here's another UI trick. If you
+
+9
+00:01:01,200 --> 00:01:08,400
+hold Alt and press down on the node there, you can actually pull it off the noodle.
+
+10
+00:01:10,880 --> 00:01:16,000
+So another one I use quite a bit is Brightness and Contrast.
+
+11
+00:01:16,000 --> 00:01:22,320
+And you can just play around with values.
+
+12
+00:01:25,200 --> 00:01:34,960
+Pull that off. And another one, Color Ramp, I use quite often. What that does, it's kind of similar
+
+13
+00:01:34,960 --> 00:01:42,880
+to Hue and Saturation, but allows you to place multiple colors that apply to the texture. So
+
+14
+00:01:43,440 --> 00:01:49,759
+here we have two colors being applied right now. And I'm going to just change one of them.
+
+15
+00:01:50,320 --> 00:01:58,000
+We'll go to like a red color. And then I'll change the white to blue.
+
+16
+00:01:59,840 --> 00:02:04,560
+What that's doing is I think it's taking the dark areas in the texture and applying red and
+
+17
+00:02:04,560 --> 00:02:11,359
+then maybe the lighter textures, lighter part of the texture and applying blue to it. And you can
+
+18
+00:02:11,360 --> 00:02:21,760
+actually change the density of one color over the other which is kind of nice. And you can add
+
+19
+00:02:23,120 --> 00:02:31,360
+another multiple colors. And again change it here. Very useful.
+
diff --git a/031000_20250221_1149 - Creating a new material from another/031000_20250221_1149 - Creating a new material from another.srt b/031000_20250221_1149 - Creating a new material from another/031000_20250221_1149 - Creating a new material from another.srt
new file mode 100644
index 0000000..622dfc6
--- /dev/null
+++ b/031000_20250221_1149 - Creating a new material from another/031000_20250221_1149 - Creating a new material from another.srt
@@ -0,0 +1,136 @@
+1
+00:00:00,000 --> 00:00:06,000
+Although the red concrete is nice, I don't think we're going to use it for our project.
+
+2
+00:00:06,000 --> 00:00:09,000
+I'm going to pull this one back in.
+
+3
+00:00:09,000 --> 00:00:13,000
+And adjust the brightness a little bit.
+
+4
+00:00:13,000 --> 00:00:15,000
+Oops, too dark.
+
+5
+00:00:15,000 --> 00:00:23,000
+So I'm just going to keep these nodes up here because they come in handy quite a bit.
+
+6
+00:00:23,000 --> 00:00:29,000
+These nodes down here, I mentioned ambient inclusion and emission.
+
+7
+00:00:29,000 --> 00:00:35,000
+I rarely use them, but sometimes you could.
+
+8
+00:00:35,000 --> 00:00:43,000
+For emission here, there's an emission plugin at the base, I believe right there.
+
+9
+00:00:43,000 --> 00:00:47,000
+And then for ambient inclusion, it's a little tricky.
+
+10
+00:00:47,000 --> 00:00:55,000
+You actually have to use a mixer node and mix the base color and the ambient inclusion together,
+
+11
+00:00:55,000 --> 00:00:58,000
+and then take the result of that and go on to the base color.
+
+12
+00:00:58,000 --> 00:01:01,000
+I rarely use that, and I'm not going to ultimately show it.
+
+13
+00:01:01,000 --> 00:01:07,000
+The nice thing is that we have this graph we spent all this time doing.
+
+14
+00:01:07,000 --> 00:01:13,000
+Now that it's set, we don't have to do it again if we're going to create a new material.
+
+15
+00:01:13,000 --> 00:01:17,000
+To create a new material, it's relatively straightforward.
+
+16
+00:01:17,000 --> 00:01:20,000
+First, I'm going to duplicate this.
+
+17
+00:01:20,000 --> 00:01:24,000
+I've got to turn off origins.
+
+18
+00:01:24,000 --> 00:01:29,000
+I'm going to change that to local.
+
+19
+00:01:29,000 --> 00:01:32,000
+And pull this off.
+
+20
+00:01:32,000 --> 00:01:39,000
+And then over here, you can click on this button here to duplicate the material and then just rename it.
+
+21
+00:01:39,000 --> 00:01:43,000
+I'm just going to do metal next.
+
+22
+00:01:43,000 --> 00:01:49,000
+And then you go through the same exercise of just changing out the texture.
+
+23
+00:01:49,000 --> 00:01:52,000
+I'm going to do metal and do color.
+
+24
+00:01:52,000 --> 00:01:56,000
+This time we have actually a metallic texture.
+
+25
+00:01:59,000 --> 00:02:02,000
+Metalness there.
+
+26
+00:02:03,000 --> 00:02:05,000
+Roughness.
+
+27
+00:02:09,000 --> 00:02:11,000
+Roughness.
+
+28
+00:02:11,000 --> 00:02:14,000
+And displacement.
+
+29
+00:02:14,000 --> 00:02:18,000
+And finally normals.
+
+30
+00:02:32,000 --> 00:02:36,000
+There we go. We got a new texture.
+
+31
+00:02:36,000 --> 00:02:43,000
+Oh, I forgot. You've got to connect the metallic texture to the metallic nail there.
+
+32
+00:02:45,000 --> 00:02:51,000
+You can see that it changes the shininess pretty considerably.
+
+33
+00:02:51,000 --> 00:02:55,000
+I'm just going to tweak the brightness.
+
+34
+00:02:55,000 --> 00:02:57,000
+We're good.
+
diff --git a/032000_20250221_1209 - Applying multiple materials to an object/032000_20250221_1209 - Applying multiple materials to an object.srt b/032000_20250221_1209 - Applying multiple materials to an object/032000_20250221_1209 - Applying multiple materials to an object.srt
new file mode 100644
index 0000000..c3a1445
--- /dev/null
+++ b/032000_20250221_1209 - Applying multiple materials to an object/032000_20250221_1209 - Applying multiple materials to an object.srt
@@ -0,0 +1,68 @@
+1
+00:00:00,000 --> 00:00:09,640
+So if you want to apply more than one material to one object, you can do that by selecting
+
+2
+00:00:09,640 --> 00:00:18,300
+the object, go to plus, switching that to say okay concrete, and then tab into the object,
+
+3
+00:00:18,300 --> 00:00:24,740
+get into edit mode, and then select the faces that you want to change the material.
+
+4
+00:00:24,740 --> 00:00:28,340
+Select it here and go to assign.
+
+5
+00:00:28,340 --> 00:00:37,900
+So rarely in BIM world do we do this or we change the material just on a face.
+
+6
+00:00:37,900 --> 00:00:41,380
+So it's usually applied to kind of the volume of the object.
+
+7
+00:00:41,380 --> 00:00:48,900
+But let me tab into it again and I'm going to select those faces, duplicate them, move
+
+8
+00:00:48,900 --> 00:00:50,660
+it over.
+
+9
+00:00:50,660 --> 00:00:56,940
+So if I tab out, you can see there's two loose meshes in this one object.
+
+10
+00:00:56,980 --> 00:01:06,900
+So if I tab in again, I can select a face and there's a quick key, control L, that selects
+
+11
+00:01:06,900 --> 00:01:10,100
+all the faces that are connected to whatever you selected.
+
+12
+00:01:10,100 --> 00:01:13,420
+So that's a nice UI trick.
+
+13
+00:01:13,420 --> 00:01:18,940
+So let's say for that one we're just going to assign metal, and for this, control L,
+
+14
+00:01:18,940 --> 00:01:19,940
+select everything.
+
+15
+00:01:19,940 --> 00:01:26,580
+And for that one we're going to do concrete.
+
+16
+00:01:26,620 --> 00:01:33,660
+And just so you know, if we tab into it, that control L is from here, if you're wondering.
+
+17
+00:01:33,660 --> 00:01:34,660
+Control L.
+
diff --git a/050000_20250221_1325 - Installing Bonsai - Stable Release/050000_20250221_1325 - Installing Bonsai - Stable Release.srt b/050000_20250221_1325 - Installing Bonsai - Stable Release/050000_20250221_1325 - Installing Bonsai - Stable Release.srt
new file mode 100644
index 0000000..b264558
--- /dev/null
+++ b/050000_20250221_1325 - Installing Bonsai - Stable Release/050000_20250221_1325 - Installing Bonsai - Stable Release.srt
@@ -0,0 +1,116 @@
+1
+00:00:00,000 --> 00:00:04,080
+Congratulations, we finally made it to Bonsai.
+
+2
+00:00:04,080 --> 00:00:08,880
+So of course the first step is to install the program.
+
+3
+00:00:08,880 --> 00:00:13,000
+To do that, go to this website here.
+
+4
+00:00:13,000 --> 00:00:17,260
+Before you click on download and install, I'm sure you'll feel curious to see what this
+
+5
+00:00:17,260 --> 00:00:19,560
+donate now is all about.
+
+6
+00:00:19,560 --> 00:00:23,760
+So click on that and it will take you to the Open Collective site where they manage their
+
+7
+00:00:23,760 --> 00:00:24,760
+funding.
+
+8
+00:00:24,760 --> 00:00:32,160
+It's called IFC Open Shell because that is the geometry kernel behind Bonsai or formerly
+
+9
+00:00:32,160 --> 00:00:33,960
+known as Blender BIM.
+
+10
+00:00:33,960 --> 00:00:41,580
+And so the organization uses this funding to help hire developers to add functionality
+
+11
+00:00:41,580 --> 00:00:42,960
+to Bonsai.
+
+12
+00:00:42,960 --> 00:00:50,480
+So if you're feeling generous, please donate.
+
+13
+00:00:50,480 --> 00:00:54,740
+Goes to obviously a good cause for free and open source software.
+
+14
+00:00:54,740 --> 00:00:58,500
+So back to download and install.
+
+15
+00:00:58,500 --> 00:01:04,360
+It takes you to this documentation page where it has steps how to install, which I'm going
+
+16
+00:01:04,360 --> 00:01:05,900
+to visually show you.
+
+17
+00:01:05,900 --> 00:01:11,500
+So back to Blender, go to edit, preferences.
+
+18
+00:01:11,500 --> 00:01:18,260
+You have to allow online access here.
+
+19
+00:01:18,260 --> 00:01:22,180
+And then you search for Bonsai.
+
+20
+00:01:22,180 --> 00:01:25,060
+And it comes up and then you click on install.
+
+21
+00:01:25,060 --> 00:01:28,540
+It'll take a while to install, so just be patient.
+
+22
+00:01:28,540 --> 00:01:31,500
+I'll come back.
+
+23
+00:01:31,500 --> 00:01:32,540
+And we're back.
+
+24
+00:01:32,540 --> 00:01:35,500
+It takes about a minute, I think, or so for it to actually install.
+
+25
+00:01:35,500 --> 00:01:39,760
+As you can tell, it's already installed by clicking on that.
+
+26
+00:01:39,760 --> 00:01:44,700
+So you can then close and boom.
+
+27
+00:01:44,700 --> 00:01:48,620
+Basically what you see is a new workspace called BIM.
+
+28
+00:01:48,620 --> 00:01:51,460
+And Bonsai is installed.
+
+29
+00:01:51,460 --> 00:01:53,140
+Congratulations.
+
diff --git a/051000_20250221_1356 - Installing Bonsai - Unstable Release/051000_20250221_1356 - Installing Bonsai - Unstable Release.srt b/051000_20250221_1356 - Installing Bonsai - Unstable Release/051000_20250221_1356 - Installing Bonsai - Unstable Release.srt
new file mode 100644
index 0000000..681507d
--- /dev/null
+++ b/051000_20250221_1356 - Installing Bonsai - Unstable Release/051000_20250221_1356 - Installing Bonsai - Unstable Release.srt
@@ -0,0 +1,84 @@
+1
+00:00:00,000 --> 00:00:05,240
+So in the previous video we showed how to install a stable release of Bonsai
+
+2
+00:00:05,240 --> 00:00:11,680
+which comes out about every two or three months and the developers try to fix as
+
+3
+00:00:11,680 --> 00:00:17,600
+many bugs for those releases as possible so they're just more stable but the
+
+4
+00:00:17,600 --> 00:00:25,440
+development happens continuous daily for the most part so if you actually want to
+
+5
+00:00:25,440 --> 00:00:30,000
+download a release or daily release or there's actually sometimes multiple
+
+6
+00:00:30,000 --> 00:00:37,000
+releases in a day to test out you know hot off the press functionality the way
+
+7
+00:00:37,000 --> 00:00:43,400
+to do that is at the bottom of the stable documentation click on unstable
+
+8
+00:00:43,400 --> 00:00:49,920
+installation and these are the steps to go install the unstable so click on
+
+9
+00:00:49,920 --> 00:00:57,960
+Bonsai unstable repository scroll down find out where your platform or
+
+10
+00:00:57,960 --> 00:01:05,920
+operating system is mine is Windows then go to edit preferences get extensions
+
+11
+00:01:05,920 --> 00:01:13,440
+allow online access again and then find the link corresponding to your operating
+
+12
+00:01:13,440 --> 00:01:20,520
+system and simply click and drag the link on to the scene say add repository
+
+13
+00:01:20,520 --> 00:01:25,920
+and then check this if you want Bonsai to remind you that there's updates new
+
+14
+00:01:25,920 --> 00:01:34,200
+updates to download and say create and then search Bonsai and you'll see that
+
+15
+00:01:34,200 --> 00:01:40,080
+there's two Bonsai that show up one is basically on the official blender
+
+16
+00:01:40,080 --> 00:01:46,240
+extensions website and then the other one is the one we just put on so you can
+
+17
+00:01:46,240 --> 00:01:52,120
+see the version number to tell the difference we want the the later version
+
+18
+00:01:52,120 --> 00:01:56,800
+number so we want to click on install and again that's going to take some time
+
+19
+00:01:56,800 --> 00:02:03,240
+to do so after about a minute it should give you this kind of indication that
+
+20
+00:02:03,240 --> 00:02:10,020
+it's installed so hopefully when I close this then bones I will the UI will
+
+21
+00:02:10,020 --> 00:02:16,460
+pop up and there we go ons I BIM workspace
+
diff --git a/051500_20250224_1329 - Installing Bonsai - from Releases site/051500_20250224_1329 - Installing Bonsai - from Releases site.srt b/051500_20250224_1329 - Installing Bonsai - from Releases site/051500_20250224_1329 - Installing Bonsai - from Releases site.srt
new file mode 100644
index 0000000..7531a5c
--- /dev/null
+++ b/051500_20250224_1329 - Installing Bonsai - from Releases site/051500_20250224_1329 - Installing Bonsai - from Releases site.srt
@@ -0,0 +1,84 @@
+1
+00:00:00,000 --> 00:00:07,680
+So there's a third way to install bonsai if you go to this website here and then go down to releases
+
+2
+00:00:09,280 --> 00:00:11,280
+You'll see
+
+3
+00:00:11,280 --> 00:00:16,240
+various packages related to the operating system and then the differentiator is
+
+4
+00:00:16,800 --> 00:00:23,300
+What Python it's using so here these forward using Python 11 and these are using Python 12
+
+5
+00:00:24,260 --> 00:00:27,980
+Blender 4.2 and 4.3 use 11
+
+6
+00:00:28,700 --> 00:00:33,380
+I'm not sure why they have 12 because I don't think there's a blender version out that uses 12
+
+7
+00:00:34,780 --> 00:00:41,060
+So anyways click on the package that corresponds save it to where you want it
+
+8
+00:00:42,260 --> 00:00:44,260
+go back to
+
+9
+00:00:44,580 --> 00:00:46,580
+Blender or the preferences and
+
+10
+00:00:47,660 --> 00:00:50,980
+now we want to add on the set of git extensions and
+
+11
+00:00:51,739 --> 00:00:57,860
+We want to install from disk and locate where you saved it so
+
+12
+00:01:03,819 --> 00:01:10,320
+So sometimes when you go through this installation it looks like it's enabled, but when you close it
+
+13
+00:01:11,300 --> 00:01:13,300
+The UI doesn't come up
+
+14
+00:01:13,620 --> 00:01:15,620
+So if that's the case
+
+15
+00:01:15,940 --> 00:01:18,179
+toggle on and off
+
+16
+00:01:18,180 --> 00:01:20,180
+This
+
+17
+00:01:22,180 --> 00:01:24,300
+It usually fixes it
+
+18
+00:01:30,860 --> 00:01:33,980
+So that took a long time I cut out a lot of the time
+
+19
+00:01:33,980 --> 00:01:37,340
+It took it probably took two minutes to do that or a minute rather
+
+20
+00:01:38,580 --> 00:01:39,900
+so
+
+21
+00:01:39,900 --> 00:01:44,220
+So for whatever reason when you toggle that on and off again the interface comes back
+
diff --git a/052000_20250224_1116 - Starting a demo project/052000_20250224_1116 - Starting a demo project.srt b/052000_20250224_1116 - Starting a demo project/052000_20250224_1116 - Starting a demo project.srt
new file mode 100644
index 0000000..39826a8
--- /dev/null
+++ b/052000_20250224_1116 - Starting a demo project/052000_20250224_1116 - Starting a demo project.srt
@@ -0,0 +1,124 @@
+1
+00:00:00,000 --> 00:00:05,280
+So let the fun begin. So before we go into the interface here let's create a
+
+2
+00:00:05,280 --> 00:00:10,640
+IFC project and to do that this is one way of doing it where you can set the
+
+3
+00:00:10,640 --> 00:00:20,240
+parameters. For the IFC schema I suggest using IFC 4. IFC 2 by 3 is older scheme
+
+4
+00:00:20,240 --> 00:00:28,800
+with less functionality and then IFC 4 by 3 is the next after IFC 4.
+
+5
+00:00:28,800 --> 00:00:35,440
+However all the functionality that it has is not supported yet in Bonsai.
+
+6
+00:00:35,440 --> 00:00:41,960
+It's getting pretty close but I would still stick to IFC 4. For this we're
+
+7
+00:00:41,960 --> 00:00:50,240
+gonna use Imperial. Sorry square feet cubic feet. Then here for your template
+
+8
+00:00:50,240 --> 00:00:55,760
+you can create a blank object with nothing in it but this one allows you to
+
+9
+00:00:55,760 --> 00:01:03,000
+create a project with a subset of types to get you started like an IFC door or
+
+10
+00:01:03,000 --> 00:01:13,600
+wall or slab and so I'm gonna do that and say create. So after you create the
+
+11
+00:01:13,600 --> 00:01:19,680
+demo project you can save the IFC file navigate to where you want to locate it
+
+12
+00:01:19,680 --> 00:01:25,240
+and we hopefully are gonna create a house over the next couple videos so I'm
+
+13
+00:01:25,240 --> 00:01:32,560
+just gonna call it house and say save. I'll go through the interface here but
+
+14
+00:01:32,560 --> 00:01:39,640
+before I do we have to create a simple object in space so I'm just gonna place
+
+15
+00:01:39,640 --> 00:01:46,360
+a cube like we did in the previous videos this is a generic vanilla cube it
+
+16
+00:01:46,360 --> 00:01:54,119
+is not an IFC file right or in the IFC file and you can check that if you go to
+
+17
+00:01:54,160 --> 00:02:01,120
+if you say save I see file okay and then you want to open that again that the
+
+18
+00:02:01,120 --> 00:02:08,360
+objects not going to be there because it's not in the IFC file so to put it in
+
+19
+00:02:08,360 --> 00:02:13,040
+the IFC file you have to change it into an IFC object and so to do that there
+
+20
+00:02:13,040 --> 00:02:19,640
+are number ways to do it but one way to do it is to once you have the object in
+
+21
+00:02:19,760 --> 00:02:24,959
+world you select it and go up to IFC element here and you want to name it
+
+22
+00:02:24,959 --> 00:02:32,359
+just test test II and we want to create an IFC element not a type yet I'll get
+
+23
+00:02:32,359 --> 00:02:38,160
+into types later class you can pick anything you'd want I've seen wall I've
+
+24
+00:02:38,160 --> 00:02:44,279
+see slab we'll just pick the first one this predefined type it always changes
+
+25
+00:02:44,279 --> 00:02:48,480
+relative to the class but here are the predefined types relative to that you
+
+26
+00:02:48,519 --> 00:02:54,679
+can pick one that makes sense or not to find it all and then here you can say
+
+27
+00:02:54,679 --> 00:03:01,320
+tessellation from object and so it's saying do you want the cube to are we
+
+28
+00:03:01,320 --> 00:03:07,260
+using the cube to convert into IFC file or you can pick another one but yes we
+
+29
+00:03:07,260 --> 00:03:11,640
+want the cube and then this context I can go in this later but for the most
+
+30
+00:03:11,640 --> 00:03:18,459
+part 95% of the time it's gonna be model body model view and so say
+
+31
+00:03:18,460 --> 00:03:27,860
+okay and now if you save and then open the project again it should be there
+
diff --git a/053000_20250224_1105 - Overview of the UI/053000_20250224_1105 - Overview of the UI.srt b/053000_20250224_1105 - Overview of the UI/053000_20250224_1105 - Overview of the UI.srt
new file mode 100644
index 0000000..bf51d93
--- /dev/null
+++ b/053000_20250224_1105 - Overview of the UI/053000_20250224_1105 - Overview of the UI.srt
@@ -0,0 +1,260 @@
+1
+00:00:00,000 --> 00:00:04,320
+Now that we have an IFC object in there we can click on it and go through the
+
+2
+00:00:04,320 --> 00:00:11,220
+overview of the UI. All these sub panels here, these icons, are underneath the
+
+3
+00:00:11,220 --> 00:00:16,020
+Blender's scene panel and you can tell that by if you open it up there's the
+
+4
+00:00:16,020 --> 00:00:23,420
+scene panel and close it by dragging it. This first one is project overview. This
+
+5
+00:00:23,420 --> 00:00:29,600
+is where you can tell it how many buildings you have, how many stories, how
+
+6
+00:00:29,600 --> 00:00:34,960
+they're all nested in each other. Some of the things that I like using, project
+
+7
+00:00:34,960 --> 00:00:38,840
+library where you can pull in content, different types from other projects,
+
+8
+00:00:38,840 --> 00:00:44,920
+links you can link an IFC file. Use this search group quite a bit so you could
+
+9
+00:00:44,920 --> 00:00:51,240
+say search all IFC walls or search all IFC walls that are concrete. Very useful
+
+10
+00:00:51,240 --> 00:00:58,400
+feature. The second tab here, object information, all the data essentially
+
+11
+00:00:58,400 --> 00:01:04,640
+that's related to the selected object. So here your attributes, you can change
+
+12
+00:01:04,640 --> 00:01:11,280
+various ones here. This is where you assign property sets and quantity sets.
+
+13
+00:01:11,280 --> 00:01:16,960
+You can you know click this and it'll actually auto populate what the
+
+14
+00:01:16,960 --> 00:01:24,759
+quantities are for that object. This next geometry and materials, this is where you
+
+15
+00:01:24,760 --> 00:01:32,640
+can assign various styles and materials. We'll obviously get into that in more
+
+16
+00:01:32,640 --> 00:01:40,160
+detail. Geometric relationships where you can add Booleans, you can manage your
+
+17
+00:01:40,160 --> 00:01:46,560
+connections like a wall connected to another wall, and also you can manage
+
+18
+00:01:46,560 --> 00:01:51,640
+your representation. So if for instance like a door could have multiple
+
+19
+00:01:52,200 --> 00:01:59,000
+representations, one would be a three-dimensional door and frame if you
+
+20
+00:01:59,000 --> 00:02:02,740
+see you know are viewing in kind of a three-dimensional view. If you're looking
+
+21
+00:02:02,740 --> 00:02:08,600
+in plan you can see the door swing which is another representation so that's
+
+22
+00:02:08,600 --> 00:02:15,080
+where you manage those. This fourth tab, drawings and documentation, you manage
+
+23
+00:02:15,080 --> 00:02:21,220
+your drawings and your sheets and how many drawings you have on a
+
+24
+00:02:21,220 --> 00:02:27,420
+sheet and kind of organize them. Services and systems, it goes into a mechanical
+
+25
+00:02:27,420 --> 00:02:32,579
+electric plumbing. Unfortunately the functionality behind this is not fully
+
+26
+00:02:32,579 --> 00:02:38,420
+mature yet. I think there is some working functionality but it's pretty premature
+
+27
+00:02:38,420 --> 00:02:46,180
+at this point. And also too, same with structural analysis. It's you know not
+
+28
+00:02:46,180 --> 00:02:51,180
+ready quite yet from what I understand. This costing and scheduling however, this
+
+29
+00:02:51,180 --> 00:02:59,060
+it's the kind of 4D, 5D part of BIM, this is pretty mature and as you can see here
+
+30
+00:02:59,060 --> 00:03:07,180
+you can just you know create work plans and work schedules. Facility management,
+
+31
+00:03:07,180 --> 00:03:13,280
+in all honesty I'm not sure how thorough this is. I don't use it much. And then
+
+32
+00:03:13,280 --> 00:03:18,060
+finally this quality and coordination. This is where you can do you know
+
+33
+00:03:18,060 --> 00:03:23,420
+debugging and purge data. You can purge like unused types for example. This
+
+34
+00:03:23,420 --> 00:03:28,620
+spreadsheet import export, it's very useful. I use that to export out data
+
+35
+00:03:28,620 --> 00:03:35,380
+into a spreadsheet whether it be LibreCalc or Excel and then you can
+
+36
+00:03:35,380 --> 00:03:39,000
+modify that data and then you can actually import it in back into the
+
+37
+00:03:39,000 --> 00:03:45,660
+model. So very useful. And then just recently you can actually export out to
+
+38
+00:03:45,660 --> 00:03:50,780
+a web UI where you can change that tabulated data and then import back in.
+
+39
+00:03:50,780 --> 00:03:55,579
+This last icon here just allows you to switch in between what your last panel
+
+40
+00:03:55,579 --> 00:04:01,540
+was. So if all this is under the scene you might be asking where is kind of the
+
+41
+00:04:01,540 --> 00:04:08,019
+vanilla blender functionality and to get that you would click down in here
+
+42
+00:04:08,019 --> 00:04:11,900
+blender properties. So here are the some some of the stuff that's been hidden if
+
+43
+00:04:11,900 --> 00:04:20,060
+you need to know where it's at. So over on the left here is the outliner and it
+
+44
+00:04:20,060 --> 00:04:25,820
+shows you how the project or what objects are in the project not
+
+45
+00:04:25,820 --> 00:04:32,820
+necessarily how it's organized. And I say not necessarily because in previous
+
+46
+00:04:32,820 --> 00:04:38,540
+versions of Bonsai there used to be more of a hierarchy here where building was
+
+47
+00:04:38,540 --> 00:04:43,260
+nested in or sorry where a story was nested in a building and then a building
+
+48
+00:04:43,260 --> 00:04:49,020
+was nested in the site and there's more hierarchy there. I'm not sure the exact
+
+49
+00:04:49,020 --> 00:04:53,980
+reasons but I understand there was a lot of technical overhead to just using
+
+50
+00:04:53,980 --> 00:04:59,060
+blender and a lot of laggyness because of that hierarchy and so recently it's
+
+51
+00:04:59,060 --> 00:05:04,860
+been kind of flattened. So in general don't necessarily try to use the
+
+52
+00:05:04,860 --> 00:05:13,100
+outliner to organize things because once you open the IFC file it will reset
+
+53
+00:05:13,100 --> 00:05:19,300
+itself. So just just know that. Here's where you list all the kind of types you
+
+54
+00:05:19,300 --> 00:05:24,180
+have and again we're in a demo project so it started with a default number and
+
+55
+00:05:24,180 --> 00:05:31,860
+I can just turn them on shift here's the number it's at a window type and door
+
+56
+00:05:31,860 --> 00:05:36,100
+type and we can actually move our cube out of the way and of course you need
+
+57
+00:05:36,100 --> 00:05:45,620
+the furniture the bunny type that's important. The columns and like wall
+
+58
+00:05:45,620 --> 00:05:51,500
+those are they're called material or profile based types and so you won't see
+
+59
+00:05:51,500 --> 00:05:56,780
+the geometry here but when we make them
+
+60
+00:05:56,820 --> 00:06:05,619
+instantiate them you'll be able to see that. And so we can close that and that's
+
+61
+00:06:05,619 --> 00:06:14,739
+about it I think. Oh no that's not it these icons here are bonsai specific and
+
+62
+00:06:14,739 --> 00:06:20,179
+we can get into that more in depth but obviously you know various wall, floor,
+
+63
+00:06:20,180 --> 00:06:28,020
+slab tools, annotation tools, space tools, structural tool, annotation that's
+
+64
+00:06:28,020 --> 00:06:33,060
+blender specific that's blender specific and so is that but yeah we'll get into
+
+65
+00:06:33,060 --> 00:06:36,700
+that more detail.
+
diff --git a/054000_20250224_1149 - Edit mode and changing your startup file/054000_20250224_1149 - Edit mode and changing your startup file.srt b/054000_20250224_1149 - Edit mode and changing your startup file/054000_20250224_1149 - Edit mode and changing your startup file.srt
new file mode 100644
index 0000000..eb9c08a
--- /dev/null
+++ b/054000_20250224_1149 - Edit mode and changing your startup file/054000_20250224_1149 - Edit mode and changing your startup file.srt
@@ -0,0 +1,100 @@
+1
+00:00:00,000 --> 00:00:06,000
+So now that we have our IFC object to move it around in world the same kind of
+
+2
+00:00:06,000 --> 00:00:12,380
+commands where you type G and then you can lock it to an axis and you can use
+
+3
+00:00:12,380 --> 00:00:22,980
+your 3d cursor. Actually let me turn on moving scale. You notice that every time
+
+4
+00:00:22,980 --> 00:00:31,220
+if you find yourself having to turn on preferences multiple times you can
+
+5
+00:00:31,220 --> 00:00:38,580
+actually save your startup file to remember those settings. So let me just
+
+6
+00:00:38,580 --> 00:00:42,900
+show you quickly. So let's just create a new blender. This is a generic blender
+
+7
+00:00:42,900 --> 00:00:50,380
+file. We're not going to save that for now. And so I have to a lot of times turn
+
+8
+00:00:50,380 --> 00:00:56,420
+these on every time I open. So I'm just going to turn them on now. Okay and now
+
+9
+00:00:56,420 --> 00:01:05,620
+go down here to defaults and you save your startup file. You say overwrite. So
+
+10
+00:01:05,620 --> 00:01:13,540
+now when you open your IFC file and you select on that that the settings are
+
+11
+00:01:13,540 --> 00:01:18,240
+already set there. So that's quite useful so you don't have to redo it all the
+
+12
+00:01:18,240 --> 00:01:28,460
+time. So I'm going to just duplicate this here. So how do you edit edit the
+
+13
+00:01:28,460 --> 00:01:32,759
+vertices then of an object? So it's similar to vanilla blender where you
+
+14
+00:01:32,759 --> 00:01:40,500
+select object and tab into it. But you actually have to tab in twice because
+
+15
+00:01:40,500 --> 00:01:47,800
+this first tab shows you essentially what representation items or items are
+
+16
+00:01:47,840 --> 00:01:54,920
+within that IFC object. Right now for this we only have one item. So if you're
+
+17
+00:01:54,920 --> 00:02:00,560
+in this mode you can tab again and that's when you'll see you know the
+
+18
+00:02:00,560 --> 00:02:06,380
+vertices that you know and love and you can change things. So you can tab out of
+
+19
+00:02:06,380 --> 00:02:11,359
+it. So you're now in that kind of item view you can see here. And so you can
+
+20
+00:02:11,359 --> 00:02:16,400
+actually from here you can create two items if you want. So I can do a shift D
+
+21
+00:02:16,400 --> 00:02:22,600
+and it doesn't move it in this view it kind of locks it but you can you know
+
+22
+00:02:22,600 --> 00:02:27,840
+right click on your mouse and so there's now two objects in this edit mode you
+
+23
+00:02:27,840 --> 00:02:36,240
+can see. You can select one of them and now you tab into it and now you can just
+
+24
+00:02:36,240 --> 00:02:42,260
+move the actual mesh and then tab out of it. Here you got two items and then you
+
+25
+00:02:42,260 --> 00:02:48,459
+can tab out of it again. You can see the whole the object itself.
+
diff --git a/055000_20250224_1227 - Using GIT to see the DIFFs between IFC versions/055000_20250224_1227 -Using GIT to see the DIFFs between IFC versions.srt b/055000_20250224_1227 - Using GIT to see the DIFFs between IFC versions/055000_20250224_1227 -Using GIT to see the DIFFs between IFC versions.srt
new file mode 100644
index 0000000..0737834
--- /dev/null
+++ b/055000_20250224_1227 - Using GIT to see the DIFFs between IFC versions/055000_20250224_1227 -Using GIT to see the DIFFs between IFC versions.srt
@@ -0,0 +1,56 @@
+1
+00:00:00,000 --> 00:00:14,000
+So as you probably already guessed, every video has its own kind of folder and then within that folder is obviously the video and then the files associated with that lesson.
+
+2
+00:00:15,000 --> 00:00:18,000
+So this is where we started the IFC file.
+
+3
+00:00:19,000 --> 00:00:26,000
+This one I don't think we made any many changes, but it saved it anyways. This third one is when we changed those cubes.
+
+4
+00:00:26,000 --> 00:00:37,000
+But I also added this model folder here, underscore model folder, where I saved the change of the IFC file after every video.
+
+5
+00:00:38,000 --> 00:00:50,000
+And the reason I do that is because you can visualize the changes, the diffs essentially, using Git between one iteration of the file to the next.
+
+6
+00:00:50,000 --> 00:01:03,000
+And so if you go to the hub, opening design, and go to model, and then click on the IFC file, you can view history.
+
+7
+00:01:04,000 --> 00:01:16,000
+And it basically tells you, if you click on one of these commits, it tells you what the changes were in the actual IFC file from the previous one.
+
+8
+00:01:16,000 --> 00:01:20,000
+So here you can tell some of the faces have changed on those cubes.
+
+9
+00:01:21,000 --> 00:01:33,000
+That's the nice thing about how Bonsai and also FreeCAD manages IFC files is that it doesn't rewrite the whole file over again.
+
+10
+00:01:34,000 --> 00:01:49,000
+It only adds those changes essentially to, it appends it to the end of the IFC file, or if you're changing some parameter, it actually just changes the parameter in the file.
+
+11
+00:01:50,000 --> 00:01:59,000
+So you can then use these industry-wide tools in the software development world to actually diff these IFC files.
+
+12
+00:01:59,000 --> 00:02:17,000
+And there's some exciting implications for that where obviously here you can see what was ultimately changed, but then you can tie it to a visual interface, and I'll show that later, where you actually visually see what has changed and what has not.
+
+13
+00:02:18,000 --> 00:02:25,000
+For example, objects will turn green if they're new, or blue I think if they've changed, or red if they've been deleted.
+
+14
+00:02:25,000 --> 00:02:35,000
+So that's an exciting part of what Bonsai and FreeCAD does in utilizing the native IFC approach, as it's called.
+
diff --git a/056000_20250224_1438 - Changing the class and attributes/056000_20250224_1438 - Changing the class and attributes.srt b/056000_20250224_1438 - Changing the class and attributes/056000_20250224_1438 - Changing the class and attributes.srt
new file mode 100644
index 0000000..b297fbd
--- /dev/null
+++ b/056000_20250224_1438 - Changing the class and attributes/056000_20250224_1438 - Changing the class and attributes.srt
@@ -0,0 +1,124 @@
+1
+00:00:00,000 --> 00:00:09,080
+So getting into the object info, if you select the object, you can under metadata here click
+
+2
+00:00:09,080 --> 00:00:15,880
+on this triangle and it basically selects all the IFC actuators in the scene.
+
+3
+00:00:15,880 --> 00:00:26,740
+If you click on, I'm just going to duplicate this quick, you click on that link here, you
+
+4
+00:00:26,740 --> 00:00:32,239
+can actually convert it to a generic Blender object.
+
+5
+00:00:32,239 --> 00:00:38,339
+I'm not quite 100% sure what this does, I always just have it checked.
+
+6
+00:00:38,339 --> 00:00:43,980
+So that just creates a generic Blender object.
+
+7
+00:00:43,980 --> 00:00:49,420
+And then the pencil here allows you to reassign if you want to do a different class.
+
+8
+00:00:49,420 --> 00:01:00,500
+So you can say door instead, you want to do a user defined and I don't know, transom.
+
+9
+00:01:00,500 --> 00:01:05,900
+And then you can actually, if you want to do something other than door, you can actually
+
+10
+00:01:05,900 --> 00:01:11,100
+pull out the class from an object in the scene somewhere if you want.
+
+11
+00:01:11,100 --> 00:01:13,140
+So I'm just going to reassign.
+
+12
+00:01:13,140 --> 00:01:16,060
+So now that's door.
+
+13
+00:01:16,060 --> 00:01:17,660
+So here are the attributes.
+
+14
+00:01:18,300 --> 00:01:25,500
+You want to edit the attributes of that door now, description, whatever you want it to be.
+
+15
+00:01:29,100 --> 00:01:32,060
+Tag, I don't usually mess with that.
+
+16
+00:01:32,060 --> 00:01:40,979
+That is, as I understand it, kind of a computer read variable.
+
+17
+00:01:40,979 --> 00:01:45,699
+It's not typically a variable that a user sets.
+
+18
+00:01:45,740 --> 00:01:50,900
+And one thing too, when you're in this mode and you're wondering what these various attributes
+
+19
+00:01:50,900 --> 00:01:54,620
+mean, you can actually right click on the value.
+
+20
+00:01:54,620 --> 00:01:58,260
+I think you can right click on it.
+
+21
+00:01:58,260 --> 00:02:05,860
+Then go to IFC description, online IFC documentation.
+
+22
+00:02:05,860 --> 00:02:13,760
+And it'll bring up this IFC documentation that is painful to go through.
+
+23
+00:02:14,160 --> 00:02:18,600
+But if you're feeling masochistic, you can check it out.
+
+24
+00:02:18,600 --> 00:02:22,440
+If you go down to attribute inheritance, click on it.
+
+25
+00:02:22,440 --> 00:02:26,480
+Can't even tell whether it's clickable, but it's expandable.
+
+26
+00:02:26,480 --> 00:02:32,600
+And then you'll see the various attributes here and the descriptions associated with
+
+27
+00:02:32,600 --> 00:02:33,600
+it.
+
+28
+00:02:33,600 --> 00:02:40,280
+So if we go down to tag, you can kind of read what it's all about.
+
+29
+00:02:40,280 --> 00:02:42,920
+Just know that it's there and sometimes can be helpful.
+
+30
+00:02:43,760 --> 00:02:52,399
+So, and yes, the other attributes.
+
+31
+00:02:52,399 --> 00:02:59,679
+Again, these attributes will change sometimes relative to what kind of class you have activated.
+
diff --git a/057000_20250224_1457 - Spatial containers and psets/057000_20250224_1457 - Spatial containers and psets.srt b/057000_20250224_1457 - Spatial containers and psets/057000_20250224_1457 - Spatial containers and psets.srt
new file mode 100644
index 0000000..e8f8637
--- /dev/null
+++ b/057000_20250224_1457 - Spatial containers and psets/057000_20250224_1457 - Spatial containers and psets.srt
@@ -0,0 +1,100 @@
+1
+00:00:00,000 --> 00:00:11,240
+Duplicate these. If you want to save an attribute across multiple selected
+
+2
+00:00:11,240 --> 00:00:23,160
+objects, you can do that. Test description. You click on this icon here. Save. You can
+
+3
+00:00:23,160 --> 00:00:27,800
+see it changes it on all three of those.
+
+4
+00:00:28,800 --> 00:00:35,720
+You can change the spatial container that the object is in. We've got that
+
+5
+00:00:35,720 --> 00:00:41,980
+pencil there. So we can assign it to building instead of my story. See the
+
+6
+00:00:41,980 --> 00:00:50,480
+difference there. You can, clicking on this, or sorry, clicking on the triangle
+
+7
+00:00:50,639 --> 00:01:02,239
+selects everything within my building. Do that for story. This will actually
+
+8
+00:01:02,239 --> 00:01:07,320
+select its spatial container then when you that way you can change the
+
+9
+00:01:07,320 --> 00:01:15,759
+attributes of it. And then if you remove the spatial container it disappears but
+
+10
+00:01:15,760 --> 00:01:20,920
+it's still in the file. It's actually moved it to this unsorted collection
+
+11
+00:01:20,920 --> 00:01:25,680
+that's turned off which you can turn it on again and then later if you want to
+
+12
+00:01:25,680 --> 00:01:39,200
+reassign it. You can add P-sets to objects under here. These are the various
+
+13
+00:01:39,200 --> 00:01:45,360
+P-sets associated with an IFC door. If you select the actuator here you can see
+
+14
+00:01:45,360 --> 00:01:54,880
+the P-sets change. One thing, one P-set that is seems to be common to a lot of
+
+15
+00:01:54,880 --> 00:02:04,120
+different IFC classes is a P-set that ends in common. You can see there and
+
+16
+00:02:04,120 --> 00:02:10,800
+there's a piece of door common here. Those are the types of P-sets where you
+
+17
+00:02:10,800 --> 00:02:17,320
+can set the status of an object. It could be existing and then you can
+
+18
+00:02:17,320 --> 00:02:28,640
+demolish it. If we check the actuator here and we can do the same here. The
+
+19
+00:02:28,640 --> 00:02:36,480
+problem however is when you it's hard to globally set the status of a lot of
+
+20
+00:02:36,480 --> 00:02:43,560
+different classes at the same time. And so in that situation I like to use if
+
+21
+00:02:43,560 --> 00:02:51,239
+I'm selecting you know more than one class I like to use this EP set status
+
+22
+00:02:51,239 --> 00:02:59,280
+class which is specific to Blender. It's a custom P-set and here you can assign
+
+23
+00:02:59,280 --> 00:03:07,600
+the status and copy it across multiple classes. So that's just a little quicker
+
+24
+00:03:07,600 --> 00:03:15,240
+way to work with statuses than having to assign these specific common P-sets to
+
+25
+00:03:15,240 --> 00:03:17,720
+everyone.
+
diff --git a/058000_20250224_1630 - Introduction to Types/058000_20250224_1630 - Introduction to Types.srt b/058000_20250224_1630 - Introduction to Types/058000_20250224_1630 - Introduction to Types.srt
new file mode 100644
index 0000000..9aa5cd9
--- /dev/null
+++ b/058000_20250224_1630 - Introduction to Types/058000_20250224_1630 - Introduction to Types.srt
@@ -0,0 +1,96 @@
+1
+00:00:00,000 --> 00:00:08,100
+So nice UI trick to know about is if you select the value of the attribute it
+
+2
+00:00:08,100 --> 00:00:14,400
+will actually select all the objects in the scene that share that value. Same
+
+3
+00:00:14,400 --> 00:00:20,220
+with p-sets you can just click on that I'll select all that share that same
+
+4
+00:00:20,220 --> 00:00:31,020
+value. So in vanilla blender when we did alt D it created an object that was
+
+5
+00:00:31,020 --> 00:00:34,900
+linked to the other one so you if you change that geometry the other one would
+
+6
+00:00:34,900 --> 00:00:43,700
+change. That functionality is disabled in Bonsai. Essentially alt D works the same
+
+7
+00:00:43,700 --> 00:00:51,180
+as shift D. So in order to create geometry where you can change one thing
+
+8
+00:00:51,180 --> 00:01:00,460
+and all the linked objects changed together is you create types. And so if
+
+9
+00:01:00,460 --> 00:01:06,460
+you right now these objects here are instances but if you want to create a
+
+10
+00:01:06,460 --> 00:01:13,979
+type out of them you can again go up here and change IFC element type and
+
+11
+00:01:13,979 --> 00:01:24,259
+then door and say reassign. So when you assign it it basically puts it into your
+
+12
+00:01:24,259 --> 00:01:31,139
+type list here and turns it off but let's say now that you want to
+
+13
+00:01:31,140 --> 00:01:41,020
+instantiate that place that in world you would select the active here and add
+
+14
+00:01:41,020 --> 00:01:52,420
+in world. So now this is an instance of a type so if I do a shift D of this
+
+15
+00:01:52,420 --> 00:02:02,380
+multiple times now if I tab into one of these double tab and change this and
+
+16
+00:02:02,380 --> 00:02:12,220
+then tab out of it you'll see that they all change. So these three are type
+
+17
+00:02:12,220 --> 00:02:19,660
+driven instances then and so here we click on this icon under type it
+
+18
+00:02:19,660 --> 00:02:25,299
+actually will select the type behind those instances and so again you can
+
+19
+00:02:25,299 --> 00:02:32,140
+change the attributes and then you can add pieces to that type that then those
+
+20
+00:02:32,140 --> 00:02:39,740
+instances would inherit. Some other things you click on this it'll select
+
+21
+00:02:39,740 --> 00:02:47,859
+all the similar types and then you can actually change the type behind an
+
+22
+00:02:47,860 --> 00:02:55,220
+instance so let's assign it to that one instead and it changes in world and then
+
+23
+00:02:55,220 --> 00:03:02,220
+finally you can actually just remove the type altogether and so then it goes back
+
+24
+00:03:02,220 --> 00:03:10,860
+to just kind of being a dumb instance or not a type driven instance.
+
diff --git a/059000_20250224_1655 - Type psets and Qtos/059000_20250224_1655 - Type psets and Qtos.srt b/059000_20250224_1655 - Type psets and Qtos/059000_20250224_1655 - Type psets and Qtos.srt
new file mode 100644
index 0000000..90b471d
--- /dev/null
+++ b/059000_20250224_1655 - Type psets and Qtos/059000_20250224_1655 - Type psets and Qtos.srt
@@ -0,0 +1,88 @@
+1
+00:00:00,000 --> 00:00:13,000
+So you can add P-sets to the actual type and then have the instance that's driven by that type take on those P-sets.
+
+2
+00:00:13,000 --> 00:00:19,000
+So here I'm selecting the door and then if I click on this it's actually selecting the type.
+
+3
+00:00:19,000 --> 00:00:32,000
+Okay and then from there we can actually add door common P-set there and let's just set the glazing area and fire rating to whatever that means.
+
+4
+00:00:34,000 --> 00:00:47,000
+And so if you select instance now you'll see it says inherited type properties from the type there and I'm actually just going to
+
+5
+00:00:49,000 --> 00:00:59,000
+to show a comparison added the door common to the instance and then change something there.
+
+6
+00:00:59,000 --> 00:01:09,000
+So you can see one set is inherited by the type and then you can see the occurrence properties there.
+
+7
+00:01:09,000 --> 00:01:21,000
+You can also calculate the quantities of an object by using this perform quantity takeoff here.
+
+8
+00:01:21,000 --> 00:01:29,000
+There's two engines essentially one is the IFC open shell engine and the other is blender.
+
+9
+00:01:29,000 --> 00:01:36,000
+And so I just recommend playing around with one or the other to see the results that you get.
+
+10
+00:01:36,000 --> 00:01:48,000
+For some classes if you perform the takeoff with say IFC open shell it does do anything so you can switch it to blender and then perform the takeoffs as you can see here.
+
+11
+00:01:48,000 --> 00:01:58,000
+Sometimes for certain objects the quantities might be incorrect so use this with a little bit of caution.
+
+12
+00:01:58,000 --> 00:02:04,000
+Get familiar with whether those numbers are correct or not.
+
+13
+00:02:05,000 --> 00:02:09,000
+So again, you duplicate this.
+
+14
+00:02:11,000 --> 00:02:19,000
+Select an instance you can click on the value and it'll select all the objects that share that value in the scene.
+
+15
+00:02:20,000 --> 00:02:26,000
+You can also just manually overwrite these here so they say eight beat.
+
+16
+00:02:26,000 --> 00:02:35,000
+But if you perform the takeoff again it will reset it back to what it was previous.
+
+17
+00:02:37,000 --> 00:02:44,000
+So just like assigning p sets to the type you can assign the quantity sets to a type as well.
+
+18
+00:02:44,000 --> 00:02:52,000
+So I'm just going to delete that and select type and then from the takeoff.
+
+19
+00:02:53,000 --> 00:03:00,000
+I think we need to maybe turn it on first. Select it. See what happens.
+
+20
+00:03:03,000 --> 00:03:07,000
+There we go. So if we select the instance then.
+
+21
+00:03:09,000 --> 00:03:14,000
+Oh, we're going to turn on or delete the instance. There we go.
+
+22
+00:03:14,000 --> 00:03:25,000
+Delete the instance. So the quantities here are driven by the type and not the instance in this case.
+
diff --git a/060000_20250226_1112 - Aggregates and Linked Aggregates/060000_20250226_1112 - Aggregates and Linked Aggregates.srt b/060000_20250226_1112 - Aggregates and Linked Aggregates/060000_20250226_1112 - Aggregates and Linked Aggregates.srt
new file mode 100644
index 0000000..44ad815
--- /dev/null
+++ b/060000_20250226_1112 - Aggregates and Linked Aggregates/060000_20250226_1112 - Aggregates and Linked Aggregates.srt
@@ -0,0 +1,168 @@
+1
+00:00:00,000 --> 00:00:04,000
+So there's a concept in IFC called aggregates.
+
+2
+00:00:04,000 --> 00:00:09,000
+It essentially allows you to group similar objects together.
+
+3
+00:00:09,000 --> 00:00:12,000
+For example, when you're making a truss,
+
+4
+00:00:12,000 --> 00:00:19,000
+you can compose the bottom and top cord and the web together as one group.
+
+5
+00:00:19,000 --> 00:00:24,000
+And so then they act as one when you move them around in space.
+
+6
+00:00:24,000 --> 00:00:28,000
+So to do that, to create an aggregate, you select the objects you want in them
+
+7
+00:00:28,000 --> 00:00:32,000
+and you go to this interface here and you click on the plus.
+
+8
+00:00:32,000 --> 00:00:35,000
+You'll keep this IFC element assembly for now.
+
+9
+00:00:35,000 --> 00:00:37,000
+I'll show you why later.
+
+10
+00:00:37,000 --> 00:00:41,000
+But just name it whatever you want, aggregate one.
+
+11
+00:00:41,000 --> 00:00:45,000
+And then you can turn on and off this little decorator here
+
+12
+00:00:45,000 --> 00:00:49,000
+that shows you that these objects are all together.
+
+13
+00:00:49,000 --> 00:00:55,000
+And then when you ultimately move them, they should move together.
+
+14
+00:00:55,000 --> 00:01:00,000
+And so just like other geometry types in Bonsai,
+
+15
+00:01:00,000 --> 00:01:04,000
+to edit this, you would tab into it.
+
+16
+00:01:04,000 --> 00:01:08,000
+You can see the interface changes so you can move around individual objects.
+
+17
+00:01:08,000 --> 00:01:15,000
+And again, from here, if you want to tab further and then tab to modify the geometry,
+
+18
+00:01:15,000 --> 00:01:16,000
+you can do that.
+
+19
+00:01:16,000 --> 00:01:22,000
+And then again, you can cycle the tab out.
+
+20
+00:01:22,000 --> 00:01:29,000
+This empty here essentially acts as the aggregate's origin.
+
+21
+00:01:29,000 --> 00:01:33,000
+So again, you can move that if you'd like to.
+
+22
+00:01:33,000 --> 00:01:38,000
+Tab out.
+
+23
+00:01:38,000 --> 00:01:45,000
+There is, similar to how types allow you to create instances
+
+24
+00:01:45,000 --> 00:01:48,000
+that can all be updated at one time,
+
+25
+00:01:48,000 --> 00:01:54,000
+you can actually create types for aggregates, and they're called linked aggregates.
+
+26
+00:01:54,000 --> 00:01:58,000
+And so to do that, you select the aggregate that you want,
+
+27
+00:01:58,000 --> 00:02:01,000
+go to linked, and say duplicate.
+
+28
+00:02:01,000 --> 00:02:04,000
+And it'll create an aggregate off in space somewhere.
+
+29
+00:02:04,000 --> 00:02:09,000
+And to tell that they're actual linked aggregates, there's a property set,
+
+30
+00:02:09,000 --> 00:02:12,000
+this bbim linked aggregates here, if you select on that one.
+
+31
+00:02:12,000 --> 00:02:17,000
+So these now, the geometry between these two are linked.
+
+32
+00:02:17,000 --> 00:02:22,000
+So if I change one here, I'm just going to move that up in space,
+
+33
+00:02:22,000 --> 00:02:24,000
+and I'll exit out of it.
+
+34
+00:02:24,000 --> 00:02:29,000
+And now to refresh that change to the other linked aggregate,
+
+35
+00:02:29,000 --> 00:02:32,000
+you hit this refresh tool here.
+
+36
+00:02:32,000 --> 00:02:35,000
+See the change is reflected.
+
+37
+00:02:35,000 --> 00:02:40,000
+This tool allows you to select all similar linked aggregates in space there.
+
+38
+00:02:41,000 --> 00:02:47,000
+This other one will just select the empties of all the linked aggregates,
+
+39
+00:02:47,000 --> 00:02:50,000
+which is handy when you have to change the attributes,
+
+40
+00:02:50,000 --> 00:02:56,000
+or I think a property set related to that actual individual aggregate.
+
+41
+00:02:56,000 --> 00:03:05,000
+And then, yes, if you want to just make it a dumb aggregate again,
+
+42
+00:03:05,000 --> 00:03:07,000
+you click on that.
+
diff --git a/061000_20250226_1138 - Introduction to Materials and Styles/061000_20250226_1138 - Introduction to Materials and Styles.srt b/061000_20250226_1138 - Introduction to Materials and Styles/061000_20250226_1138 - Introduction to Materials and Styles.srt
new file mode 100644
index 0000000..fc033de
--- /dev/null
+++ b/061000_20250226_1138 - Introduction to Materials and Styles/061000_20250226_1138 - Introduction to Materials and Styles.srt
@@ -0,0 +1,112 @@
+1
+00:00:00,000 --> 00:00:08,100
+So in bonsai there's two concepts called materials and styles. So materials define
+
+2
+00:00:08,100 --> 00:00:16,400
+the physical composition of an element such as concrete, wood, or steel. Styles on
+
+3
+00:00:16,400 --> 00:00:21,720
+the other hand control the visual appearance of the elements so including
+
+4
+00:00:21,720 --> 00:00:29,800
+colors, textures, rendering properties. So while materials affect structural and
+
+5
+00:00:30,000 --> 00:00:36,600
+analytical properties styles are primarily used to influence how objects
+
+6
+00:00:36,600 --> 00:00:47,560
+are displayed in the models and the drawings. So to create a style you would
+
+7
+00:00:47,560 --> 00:01:02,680
+click on here and say add and we're gonna just do say concrete. And there's a
+
+8
+00:01:02,680 --> 00:01:10,120
+number of ways you can create this style. We're just gonna do this first one here.
+
+9
+00:01:11,120 --> 00:01:20,240
+Unfortunately these these four here don't necessarily work 100% right now and we'll
+
+10
+00:01:20,240 --> 00:01:24,640
+go into external defined surface styles later but we'll start with IFC surface
+
+11
+00:01:24,640 --> 00:01:33,640
+style shading and it basically just changes the color of the object and say
+
+12
+00:01:33,680 --> 00:01:43,280
+save new style and then you can apply a style directly to geometry but the best
+
+13
+00:01:43,280 --> 00:01:50,840
+way to do it is to tie the style to the material and then apply the material to
+
+14
+00:01:50,840 --> 00:01:56,600
+the object. So to apply the style to the material we first have to create a
+
+15
+00:01:56,759 --> 00:02:06,600
+material we're gonna call it concrete slap. You can keep these you can fill
+
+16
+00:02:06,600 --> 00:02:13,040
+these in or not it's up to you. So here we have the concrete material now we
+
+17
+00:02:13,040 --> 00:02:23,120
+have to link that style that we just made so click on that and here we can
+
+18
+00:02:23,120 --> 00:02:30,480
+assign concrete and then for 99% of the time keep this model body model view and
+
+19
+00:02:30,480 --> 00:02:37,240
+say assign. Okay so now we have the style here it's connected to the concrete slab.
+
+20
+00:02:37,240 --> 00:02:45,880
+Now to apply the material to the actual objects use this interface here and we
+
+21
+00:02:45,880 --> 00:02:51,680
+can go into these others later but the easiest one to use the I see material
+
+22
+00:02:51,720 --> 00:02:58,640
+basically is attaching one material to the object and so yes we want concrete
+
+23
+00:02:58,640 --> 00:03:06,840
+slab and then say add. Then later if we don't like that color necessarily we can
+
+24
+00:03:06,840 --> 00:03:13,800
+pick the style pick the shade and modify it here so make it a little more concrete
+
+25
+00:03:13,800 --> 00:03:22,840
+color and hit save. So as you can imagine best practices are to have a limited
+
+26
+00:03:22,840 --> 00:03:30,240
+number of styles and then just apply those to a number of materials so for
+
+27
+00:03:30,240 --> 00:03:39,480
+example you could create a material that is concrete footing and then from there
+
+28
+00:03:39,480 --> 00:03:45,440
+apply the same concrete material to it.
+
diff --git a/062000_20250226_1218 - Applying multiple styles or materials to one object/062000_20250226_1218 - Applying multiple styles or materials to one object.srt b/062000_20250226_1218 - Applying multiple styles or materials to one object/062000_20250226_1218 - Applying multiple styles or materials to one object.srt
new file mode 100644
index 0000000..8323f44
--- /dev/null
+++ b/062000_20250226_1218 - Applying multiple styles or materials to one object/062000_20250226_1218 - Applying multiple styles or materials to one object.srt
@@ -0,0 +1,176 @@
+1
+00:00:00,000 --> 00:00:06,880
+As I mentioned before you can apply styles directly to the geometry, although I don't necessarily recommend it
+
+2
+00:00:07,300 --> 00:00:12,000
+Recommend again to apply the style to the material and then the material to the geometry
+
+3
+00:00:12,160 --> 00:00:18,800
+But you can apply the style directly. So to do that. I have this object here. It's got two mesh
+
+4
+00:00:19,720 --> 00:00:21,960
+objects in it essentially the
+
+5
+00:00:22,740 --> 00:00:24,740
+Way to do it is to click on
+
+6
+00:00:25,600 --> 00:00:27,600
+representation items here two items found
+
+7
+00:00:28,240 --> 00:00:29,760
+and
+
+8
+00:00:30,760 --> 00:00:36,680
+Little tab into it here so you can see what's going on. So if I select that and click on that you can see
+
+9
+00:00:37,360 --> 00:00:39,360
+what mesh it applies to and
+
+10
+00:00:40,080 --> 00:00:46,440
+Similarly, you can see what mesh it applies to so to apply the style to that mesh
+
+11
+00:00:46,600 --> 00:00:50,760
+You would click on here and let's just say frame
+
+12
+00:00:52,080 --> 00:00:56,040
+that's a style this you know comes default with the demo and
+
+13
+00:00:57,320 --> 00:00:59,720
+Here we can do glass
+
+14
+00:01:00,760 --> 00:01:02,760
+say ok and
+
+15
+00:01:04,080 --> 00:01:08,240
+Close that and tab out of it then so here you can see it applied
+
+16
+00:01:10,039 --> 00:01:12,039
+The
+
+17
+00:01:12,160 --> 00:01:14,360
+Ideal way to do it is to
+
+18
+00:01:16,120 --> 00:01:20,600
+Again, apply the style to a material. So I'm gonna do that quickly
+
+19
+00:01:21,600 --> 00:01:24,120
+Do say window sash?
+
+20
+00:01:24,120 --> 00:01:26,120
+And
+
+21
+00:01:28,560 --> 00:01:33,840
+We're gonna do another one called insulated glazing
+
+22
+00:01:36,840 --> 00:01:38,840
+And we're gonna apply
+
+23
+00:01:38,920 --> 00:01:44,120
+The styles to it. So apply the frame style. Yep. That's what we want assigned
+
+24
+00:01:45,000 --> 00:01:48,520
+Insulated glazing we want to apply the glass
+
+25
+00:01:49,800 --> 00:01:51,800
+Okay
+
+26
+00:01:52,080 --> 00:01:54,080
+So if we're gonna now
+
+27
+00:01:54,840 --> 00:01:58,400
+Apply the materials to the object instead of the styles
+
+28
+00:01:59,080 --> 00:02:03,880
+You would switch this to I've seen material and stitch one set
+
+29
+00:02:04,480 --> 00:02:10,920
+And we're gonna start with insulated glazing and add that and we're gonna add another one
+
+30
+00:02:12,000 --> 00:02:15,440
+We're gonna add the window sash and say ok
+
+31
+00:02:17,200 --> 00:02:21,820
+So in here we have to name these so we can
+
+32
+00:02:24,120 --> 00:02:26,600
+Pull them up later. So we're I'm just gonna call it sash
+
+33
+00:02:28,320 --> 00:02:32,960
+So and then over here just gonna call this up
+
+34
+00:02:34,680 --> 00:02:36,880
+But I did that right sash sorry
+
+35
+00:02:40,040 --> 00:02:42,040
+This glazing
+
+36
+00:02:42,760 --> 00:02:44,760
+There we go
+
+37
+00:02:45,560 --> 00:02:46,600
+And
+
+38
+00:02:46,600 --> 00:02:47,640
+same
+
+39
+00:02:47,640 --> 00:02:53,799
+Area the representation items, so we're actually gonna delete the attached style to those
+
+40
+00:02:54,959 --> 00:02:59,880
+meshes and now we're gonna go down here to you this the shape aspect and
+
+41
+00:03:01,440 --> 00:03:08,399
+It's kind of hard to tell but this is actually kind of a drop-down and so this is where you assign say the glazing
+
+42
+00:03:08,799 --> 00:03:14,519
+Say ok, then you pick the other mesh go on here and you can sign the sash
+
+43
+00:03:17,640 --> 00:03:20,359
+Ok, you can flip between it
+
+44
+00:03:24,359 --> 00:03:26,359
+And there you go
+
diff --git a/063000_20250226_1246 - External Styles/063000_20250226_1246 - External Styles.srt b/063000_20250226_1246 - External Styles/063000_20250226_1246 - External Styles.srt
new file mode 100644
index 0000000..0939418
--- /dev/null
+++ b/063000_20250226_1246 - External Styles/063000_20250226_1246 - External Styles.srt
@@ -0,0 +1,160 @@
+1
+00:00:00,000 --> 00:00:08,520
+So I can show you now how to apply this external materials. So here I have three
+
+2
+00:00:08,520 --> 00:00:15,320
+Blender sessions open. I have a new file that I just created. I have the
+
+3
+00:00:15,320 --> 00:00:20,600
+old file that we worked on when we were just going through how to use Blender
+
+4
+00:00:20,600 --> 00:00:25,680
+just by itself. And then I have the file, the IFC file, that we've been working on.
+
+5
+00:00:25,680 --> 00:00:30,360
+So first I'm going to go back to this file and I'm going to select this object
+
+6
+00:00:30,360 --> 00:00:35,519
+here which we have concrete and this metal texture applied to. And I'm going
+
+7
+00:00:35,519 --> 00:00:40,560
+to go to this brand new Blender file and I'm just going to paste it in. I'm going to
+
+8
+00:00:40,560 --> 00:00:45,760
+turn on the material preview. You see my...
+
+9
+00:00:46,000 --> 00:00:53,080
+And we're going to go down here to this cube. I'm going to shift D, duplicate it, and I'm
+
+10
+00:00:53,080 --> 00:00:57,800
+going to open this and go to the Blender materials and I'm going to switch that to
+
+11
+00:00:57,800 --> 00:01:07,360
+concrete and I'm going to switch this to metal. And then I'm going to save this
+
+12
+00:01:07,360 --> 00:01:16,000
+file and I made a new materials folder and then yes I'm just going to replace
+
+13
+00:01:16,000 --> 00:01:20,680
+this I made it before so materials. So that's going to essentially be our
+
+14
+00:01:20,680 --> 00:01:28,160
+materials library and I'm going to delete what we brought in. I only did
+
+15
+00:01:28,160 --> 00:01:31,560
+that just to bring the materials in. So this is our material library it's got
+
+16
+00:01:31,560 --> 00:01:35,960
+two materials and I'm going to save it.
+
+17
+00:01:36,040 --> 00:01:46,280
+Control S. So go back to your IFC file and we are now...
+
+18
+00:01:46,800 --> 00:01:52,600
+So right now this concrete has a shade definition to it. We're going to
+
+19
+00:01:52,600 --> 00:01:57,720
+replace it with an external material definition instead. So if you hit on the
+
+20
+00:01:57,720 --> 00:02:03,880
+external and then append from blend file and then navigate to that materials
+
+21
+00:02:03,880 --> 00:02:10,520
+library we just made. Select it and over here you can assign what material you're
+
+22
+00:02:10,520 --> 00:02:16,960
+pulling out of that library. So for this we're going to do a concrete say okay
+
+23
+00:02:16,960 --> 00:02:22,760
+and then save external and then we're going to make a new style. We're going to
+
+24
+00:02:22,760 --> 00:02:32,920
+call it metal flashing or just no sorry galvanized metal let's say and right out
+
+25
+00:02:32,920 --> 00:02:38,720
+of the gate we're going to do externally defined surface style and say save.
+
+26
+00:02:38,720 --> 00:02:46,000
+Select it go back to the external and now append so select here and then we
+
+27
+00:02:46,000 --> 00:02:52,720
+want metal say okay and save and up here we're just going to create a new
+
+28
+00:02:52,720 --> 00:03:06,440
+material call it sheet metal. Select the sheet metal and now we want to apply
+
+29
+00:03:06,560 --> 00:03:13,000
+that material style to it galvanized metal. So okay so now we go to the object
+
+30
+00:03:13,000 --> 00:03:25,280
+here we can and we'll turn on material preview there and we'll go to to do the
+
+31
+00:03:25,280 --> 00:03:28,280
+sorry
+
+32
+00:03:28,280 --> 00:03:38,440
+sheet metal and apply and then if it doesn't you don't see it right away okay
+
+33
+00:03:38,440 --> 00:03:47,880
+there it went and then we're gonna apply just yeah concrete footing to that one
+
+34
+00:03:48,040 --> 00:03:53,680
+and if it doesn't show right away you can go here turn that to external and
+
+35
+00:03:53,680 --> 00:04:02,040
+then refresh and hopefully it'll come back. Oh there goes finally there you go
+
+36
+00:04:02,040 --> 00:04:09,680
+so if you remember we use this blend file here to seed or start our material
+
+37
+00:04:09,680 --> 00:04:15,200
+library but we also have to bring over our texture so which if you remember
+
+38
+00:04:15,200 --> 00:04:20,960
+from last couple videos or these here so I'm just gonna copy the whole texture
+
+39
+00:04:20,959 --> 00:04:28,560
+folder and go back to our model folder here and in materials I'm just gonna
+
+40
+00:04:28,560 --> 00:04:33,080
+paste the texture folder then
+
diff --git a/064000_20250226_1329 - Creating a Slab/064000_20250226_1329 - Creating a Slab.srt b/064000_20250226_1329 - Creating a Slab/064000_20250226_1329 - Creating a Slab.srt
new file mode 100644
index 0000000..caa095b
--- /dev/null
+++ b/064000_20250226_1329 - Creating a Slab/064000_20250226_1329 - Creating a Slab.srt
@@ -0,0 +1,92 @@
+1
+00:00:00,000 --> 00:00:07,840
+All right let's start having some fun now make some real buildings. So we are over the next couple
+
+2
+00:00:07,840 --> 00:00:16,720
+videos going to remodel this project. It's a project that I did a couple months ago and
+
+3
+00:00:16,720 --> 00:00:24,320
+still ongoing actually. It's a pocket neighborhood in Wisconsin so we're going to remodel this house.
+
+4
+00:00:25,200 --> 00:00:32,960
+It probably won't be exact but this it'll start for inspiration. So we're gonna first model the
+
+5
+00:00:32,960 --> 00:00:40,879
+slab in our new file. So I want to essentially just turn on all the slabs. So I'm going to go
+
+6
+00:00:40,879 --> 00:00:47,600
+ctrl i to invert the selection then do h. So here's you know all the slabs in that file.
+
+7
+00:00:48,480 --> 00:00:56,160
+So we're going to model this concrete slab first. So I'm going to locate my 3d cursor
+
+8
+00:00:56,160 --> 00:01:00,000
+that corner. I'm going to add a kind of a temporary cube object.
+
+9
+00:01:03,520 --> 00:01:08,800
+Type the period key to zoom in on it locate the 3d cursor and we're going to move this
+
+10
+00:01:08,800 --> 00:01:17,920
+to the corner. Okay and then we're going to copy it and we're going to go back to our file
+
+11
+00:01:18,640 --> 00:01:23,280
+and we're going to paste it in world and you can see there. So I'm going to click on it and type
+
+12
+00:01:23,280 --> 00:01:29,360
+period. Period when we're in the view and it'll zoom to where it's at. You can see all the stuff
+
+13
+00:01:29,360 --> 00:01:35,440
+we did previous video this is where kind of the slab location is and I did that just so I know
+
+14
+00:01:35,440 --> 00:01:42,000
+ultimately where to locate the slab. So from here we can start drawing in our slab.
+
+15
+00:01:42,000 --> 00:01:47,200
+So we use the slab tool. If you go up here you can click on that icon it's the type launcher.
+
+16
+00:01:47,200 --> 00:01:51,840
+It shows you what types are in the project. So far in this demo project we have two.
+
+17
+00:01:52,400 --> 00:01:58,880
+So we'll click on that one to set the active and we'll ignore the angle at this point and then
+
+18
+00:01:58,880 --> 00:02:03,759
+click on add. So it's actually your where's your first corner of your slab. We'll click there
+
+19
+00:02:04,480 --> 00:02:11,440
+and as you're dragging out you can lock to an axis by typing x or y. So here then we'll type
+
+20
+00:02:11,440 --> 00:02:22,160
+in the dimension. So equal 39 feet plus nine inches. Okay go change it to the y. Type in the
+
+21
+00:02:22,160 --> 00:02:39,519
+same 39 foot plus nine inches. Okay x. I'm gonna go 15 feet plus nine inches. Y. I'm gonna go down 24.
+
+22
+00:02:42,800 --> 00:02:50,079
+X. So as you're coming here you can actually click here without typing the dimension and then either
+
+23
+00:02:50,080 --> 00:02:56,400
+type c to close it or you can just do enter to close it and there's your slab.
+
diff --git a/065000_20250226_1404 - Modifying the slab/065000_20250226_1404 - Modifying the slab.srt b/065000_20250226_1404 - Modifying the slab/065000_20250226_1404 - Modifying the slab.srt
new file mode 100644
index 0000000..2155a33
--- /dev/null
+++ b/065000_20250226_1404 - Modifying the slab/065000_20250226_1404 - Modifying the slab.srt
@@ -0,0 +1,164 @@
+1
+00:00:00,000 --> 00:00:06,160
+Okay now that we have our slab we can start refining the information or data
+
+2
+00:00:06,160 --> 00:00:11,480
+associated with that slab. So let's say for instance we want to change its
+
+3
+00:00:11,480 --> 00:00:17,920
+thickness. You would do that in this tab come down here to object materials and
+
+4
+00:00:17,920 --> 00:00:24,000
+click on that pencil and here's the layer the default layers so far in our
+
+5
+00:00:24,000 --> 00:00:30,560
+slab definition and click on that and we want to actually make it four inches
+
+6
+00:00:30,560 --> 00:00:37,200
+so four out of twelve I think you have to do four to twelve it let me see if you
+
+7
+00:00:37,200 --> 00:00:48,360
+can just do four inches so and ultimately want to assign it the
+
+8
+00:00:48,360 --> 00:00:53,879
+material concrete there I you can essentially ignore these I don't fill
+
+9
+00:00:53,880 --> 00:01:02,280
+them in that often so save changes and you can see it was thicker than four
+
+10
+00:01:02,280 --> 00:01:07,240
+inches before and so our origin now is is off a little bit so this is where you
+
+11
+00:01:07,240 --> 00:01:17,560
+change where the slab is relative to the origin so we're gonna do negative four
+
+12
+00:01:17,560 --> 00:01:29,560
+inches it aligns the slab to the origin now so it's at zero and let's say now we
+
+13
+00:01:29,560 --> 00:01:37,000
+want to change we have more information on what that concrete slab is so we can
+
+14
+00:01:37,000 --> 00:01:45,840
+double well let's just do the pencil and then I actually just have you pull this
+
+15
+00:01:45,840 --> 00:01:55,480
+out to see what I wrote so a little more information to to the slab okay when
+
+16
+00:01:55,480 --> 00:02:02,640
+you select that you can see that it's reflected here and again if you had
+
+17
+00:02:02,640 --> 00:02:08,440
+multiple slabs all over the place you click on this material it should select
+
+18
+00:02:08,440 --> 00:02:15,960
+all the slabs in world so a couple things you can do to a slab after the
+
+19
+00:02:15,960 --> 00:02:22,240
+fact I'm just gonna duplicate this off the side so let's say you've made this
+
+20
+00:02:22,240 --> 00:02:28,960
+slab and you want to later on edit the slab select it tab into it like usual
+
+21
+00:02:28,960 --> 00:02:34,920
+and then there are a number of tools CAD tools you can use if you're familiar
+
+22
+00:02:34,920 --> 00:02:40,959
+with any of the other CAD programs these will probably be familiar to you
+
+23
+00:02:40,959 --> 00:02:51,880
+so go through a couple fill it there you can set the radius down here tab out of
+
+24
+00:02:51,880 --> 00:02:58,040
+it see what it looks like tab into it again unfortunately after this is made
+
+25
+00:02:58,040 --> 00:03:03,079
+and you want to change the radius there's no nice way of doing it you can
+
+26
+00:03:03,080 --> 00:03:08,120
+you know click on these handles here and pull them but there's really no way
+
+27
+00:03:08,120 --> 00:03:16,040
+again to get the exact radius so to do that you have to delete these edges and
+
+28
+00:03:16,040 --> 00:03:22,720
+bring these together again and the join tool and then fill it again to change
+
+29
+00:03:22,720 --> 00:03:37,600
+the angle there you can add in like a circle scale it you can bring it inside
+
+30
+00:03:37,600 --> 00:03:44,560
+the overall outline there hit tab and you can see there's a whole diving into
+
+31
+00:03:44,560 --> 00:03:54,120
+it again just like you do with meshes you can select a line you can subdivide
+
+32
+00:03:54,120 --> 00:04:02,160
+it line out you select these three points and create a three-point arc out
+
+33
+00:04:02,160 --> 00:04:11,720
+of it you want to switch this back to a hard poly line you'd reset the vertex
+
+34
+00:04:11,720 --> 00:04:23,000
+there and what else yeah join tool can just duplicate that edge and extend that
+
+35
+00:04:23,000 --> 00:04:32,480
+edge to that I believe yep okay and offset so offset make sure you're in the
+
+36
+00:04:32,480 --> 00:04:38,880
+top view when you do it click here you can see the distance if you're in kind
+
+37
+00:04:38,880 --> 00:04:44,560
+of a an angle like this you'll notice when I change the dimension it changes
+
+38
+00:04:44,560 --> 00:04:53,159
+relative to the view so make sure you're flat when you do that and then ultimately
+
+39
+00:04:53,159 --> 00:04:57,400
+when you're in this edit mode you don't like what you're doing you can hit
+
+40
+00:04:57,400 --> 00:05:01,880
+escape and it doesn't save any of the changes so I'm just going to delete this
+
+41
+00:05:01,880 --> 00:05:04,159
+thing
+
diff --git a/066000_20250226_1503 - Creating the basement slab/066000_20250226_1503 - Creating the basement slab.srt b/066000_20250226_1503 - Creating the basement slab/066000_20250226_1503 - Creating the basement slab.srt
new file mode 100644
index 0000000..c4611ab
--- /dev/null
+++ b/066000_20250226_1503 - Creating the basement slab/066000_20250226_1503 - Creating the basement slab.srt
@@ -0,0 +1,116 @@
+1
+00:00:00,000 --> 00:00:08,280
+So off-camera I modeled this garage slab. It's the same type. You select all the
+
+2
+00:00:08,280 --> 00:00:15,480
+same similar types here. You'll notice that there are some weird effects here
+
+3
+00:00:15,480 --> 00:00:22,760
+where this line is happening with the material and it's actually our material
+
+4
+00:00:22,760 --> 00:00:31,960
+definition needs to be corrected. So if you go to our material library file where
+
+5
+00:00:31,960 --> 00:00:36,140
+you have the concrete and metal, you select the material. The one thing we
+
+6
+00:00:36,140 --> 00:00:40,520
+have to change is we got to change that to object space. Then I'm going to change
+
+7
+00:00:40,520 --> 00:00:51,240
+that one to object space. Then save the library. Go back to our file and then in
+
+8
+00:00:51,240 --> 00:01:01,720
+materials. Let's see here. Open that. Oh no, sorry. Open styles and then refresh that and
+
+9
+00:01:01,720 --> 00:01:13,600
+hopefully it should fix it. So if we want to change the name of this type after the
+
+10
+00:01:13,600 --> 00:01:21,080
+fact, we can select the instance. Select that and change it here if we want.
+
+11
+00:01:21,080 --> 00:01:32,119
+Concrete slab or we can do it where select the slab tool. Open a type manager
+
+12
+00:01:32,119 --> 00:01:36,240
+and we can rename from here.
+
+13
+00:01:43,600 --> 00:01:50,880
+So the house that we're emulating here does not have a basement. It's just a
+
+14
+00:01:50,880 --> 00:01:57,080
+slab on grade. But for this exercise let's create a basement in this. So I'm
+
+15
+00:01:57,080 --> 00:02:05,000
+going to duplicate this slab. Shift D. Then I'm going to move it down. 8 foot
+
+16
+00:02:05,000 --> 00:02:20,360
+8 inches. So that should be 8 foot 8 inches. This will be our
+
+17
+00:02:20,360 --> 00:02:26,320
+basement slab and so we want to actually change this now to a different type of
+
+18
+00:02:26,320 --> 00:02:34,360
+slab. We'll call it OSB slab for the sheeting. So we're just
+
+19
+00:02:34,360 --> 00:02:41,520
+going to switch it here to this floor 300 which is a default. And then we are
+
+20
+00:02:41,520 --> 00:02:52,800
+going to select the type and change it to floor sheathing. Okay. Select it again.
+
+21
+00:02:52,800 --> 00:03:00,520
+Go to your material makeup here in the layers and we are going to change this
+
+22
+00:03:00,520 --> 00:03:13,440
+to 3 quarter inch. And we're going to turn on the wire frame so it's a little
+
+23
+00:03:13,440 --> 00:03:24,040
+easier to see. Turn off the triangulation a little bit. Okay. We want the origin at
+
+24
+00:03:24,040 --> 00:03:31,680
+the top. So we are going to change that.
+
+25
+00:03:31,680 --> 00:03:40,840
+Oops sorry. Here negative 0.75 inches.
+
+26
+00:03:41,480 --> 00:03:49,680
+Okay that's at zero and let's create a new material then for it. Let's call it
+
+27
+00:03:49,680 --> 00:04:02,360
+3 quarter inch OSB. Then we can apply that material here as well.
+
+28
+00:04:04,720 --> 00:04:12,760
+Quarter OSB save and save. We haven't applied a style yet to that material but we will
+
+29
+00:04:12,760 --> 00:04:15,760
+eventually.
+
diff --git a/067000_20250226_1636 - Basement Walls/067000_20250226_1636 - Basement Walls.srt b/067000_20250226_1636 - Basement Walls/067000_20250226_1636 - Basement Walls.srt
new file mode 100644
index 0000000..b83436b
--- /dev/null
+++ b/067000_20250226_1636 - Basement Walls/067000_20250226_1636 - Basement Walls.srt
@@ -0,0 +1,264 @@
+1
+00:00:00,000 --> 00:00:08,080
+So you can see I open this IFC file in new and our wireframe lines that we turned on
+
+2
+00:00:08,080 --> 00:00:10,420
+last time are not there.
+
+3
+00:00:10,420 --> 00:00:14,760
+So let's actually just save our startup file.
+
+4
+00:00:14,760 --> 00:00:16,720
+Say new.
+
+5
+00:00:16,720 --> 00:00:18,520
+Don't save this.
+
+6
+00:00:18,520 --> 00:00:20,960
+This is the startup file.
+
+7
+00:00:20,960 --> 00:00:23,400
+I'm going to turn on wireframe.
+
+8
+00:00:23,400 --> 00:00:27,840
+Turn off this triangulation.
+
+9
+00:00:27,840 --> 00:00:28,840
+And save.
+
+10
+00:00:28,840 --> 00:00:32,840
+Alt, save startup file.
+
+11
+00:00:32,840 --> 00:00:33,840
+Overwrite.
+
+12
+00:00:33,840 --> 00:00:42,680
+Then open up our house file.
+
+13
+00:00:42,680 --> 00:00:43,680
+And hopefully.
+
+14
+00:00:43,680 --> 00:00:48,440
+Okay, yep, the wireframe lines are there then.
+
+15
+00:00:48,440 --> 00:00:50,500
+Alright, cool.
+
+16
+00:00:50,500 --> 00:00:57,140
+So let's start making the basement walls then.
+
+17
+00:00:57,140 --> 00:01:01,860
+Before we do, let's see what this dimension is here.
+
+18
+00:01:01,860 --> 00:01:09,460
+That is, that dimension is below the first floor.
+
+19
+00:01:09,460 --> 00:01:14,240
+So I'm just going to copy this without the feet.
+
+20
+00:01:14,240 --> 00:01:18,900
+And here let's create a new IFC story.
+
+21
+00:01:18,900 --> 00:01:25,580
+So click on the space or my building that you want your story in.
+
+22
+00:01:25,580 --> 00:01:29,940
+And change this to my story.
+
+23
+00:01:29,940 --> 00:01:35,179
+Rename it basement.
+
+24
+00:01:35,179 --> 00:01:39,940
+And we're going to paste that dimension in there that negative.
+
+25
+00:01:39,940 --> 00:01:40,940
+Okay.
+
+26
+00:01:40,940 --> 00:01:45,900
+And we can change this first floor.
+
+27
+00:01:45,900 --> 00:01:53,580
+Alright, so right now it says your default first floor.
+
+28
+00:01:53,580 --> 00:02:00,080
+So when we activate our tool, and we'll just use this generic type for now, and we click
+
+29
+00:02:00,080 --> 00:02:04,820
+and add, it acts the same way as the slab.
+
+30
+00:02:04,820 --> 00:02:16,040
+So if I click here and I click here and say enter, it puts that wall on the default level
+
+31
+00:02:16,040 --> 00:02:17,880
+there, the first floor.
+
+32
+00:02:17,880 --> 00:02:23,340
+But if we want to change that to our basement, click on that and set it to default.
+
+33
+00:02:23,340 --> 00:02:25,460
+Here you see it changes default.
+
+34
+00:02:25,460 --> 00:02:33,700
+So now when we put our tool here, wall tool, and add in our walls, we can click here if
+
+35
+00:02:33,700 --> 00:02:35,020
+we want.
+
+36
+00:02:35,020 --> 00:02:43,380
+You can see that it snaps to that lower level.
+
+37
+00:02:43,380 --> 00:02:46,260
+And then C for closing it again.
+
+38
+00:02:46,260 --> 00:02:49,880
+And there are basement walls.
+
+39
+00:02:49,880 --> 00:02:59,680
+So similar to the slab, we can change the layers and the thickness of walls as well.
+
+40
+00:02:59,680 --> 00:03:03,960
+So that's done in kind of the same location.
+
+41
+00:03:03,960 --> 00:03:11,640
+Make these eight inch walls.
+
+42
+00:03:11,640 --> 00:03:16,000
+And we can assign, do we have just concrete?
+
+43
+00:03:16,000 --> 00:03:19,120
+Let's just do concrete footing for now.
+
+44
+00:03:19,360 --> 00:03:21,360
+We can change that later.
+
+45
+00:03:26,360 --> 00:03:29,360
+We turn our materials on.
+
+46
+00:03:35,360 --> 00:03:36,800
+Okay, there's our basement walls.
+
+47
+00:03:36,800 --> 00:03:42,360
+Now let's see here, I want to select all those wall types.
+
+48
+00:03:42,360 --> 00:03:43,360
+Oops, sorry.
+
+49
+00:03:43,360 --> 00:03:46,960
+Select all the wall types.
+
+50
+00:03:47,800 --> 00:03:49,800
+And move them down four inches.
+
+51
+00:03:49,800 --> 00:03:55,400
+Negative four inches.
+
+52
+00:03:55,400 --> 00:04:00,720
+And now I want to take the slab and edit the profile.
+
+53
+00:04:00,720 --> 00:04:07,080
+I'm going to look at the floor level.
+
+54
+00:04:07,080 --> 00:04:11,200
+And go to my tools and I'm going to offset.
+
+55
+00:04:11,200 --> 00:04:16,760
+I want to offset that eight inches, eight by 12.
+
+56
+00:04:17,560 --> 00:04:20,399
+So it creates another duplicate when you use offset.
+
+57
+00:04:20,399 --> 00:04:25,080
+So if it looks good, then you can delete your other outline.
+
+58
+00:04:25,080 --> 00:04:30,320
+So control L, if you remember, that links all the connected geometry.
+
+59
+00:04:30,320 --> 00:04:33,520
+And then you can delete it, delete edges.
+
+60
+00:04:33,520 --> 00:04:36,719
+And then tab out of it.
+
+61
+00:04:36,719 --> 00:04:43,400
+And there our concrete slab is inside our foundation wall.
+
+62
+00:04:43,440 --> 00:04:46,440
+And we can again select all these walls.
+
+63
+00:04:46,440 --> 00:04:50,440
+And we're going to change the height of them.
+
+64
+00:04:50,440 --> 00:04:57,440
+They're eight foot, ten inch walls and one and a half.
+
+65
+00:04:57,440 --> 00:05:00,440
+I want to refresh.
+
+66
+00:05:00,440 --> 00:05:02,440
+It'll change.
+
diff --git a/068000_20250226_1709 - Pulling a material from another library/068000_20250226_1709 - Pulling a material from another library.srt b/068000_20250226_1709 - Pulling a material from another library/068000_20250226_1709 - Pulling a material from another library.srt
new file mode 100644
index 0000000..c4b82f8
--- /dev/null
+++ b/068000_20250226_1709 - Pulling a material from another library/068000_20250226_1709 - Pulling a material from another library.srt
@@ -0,0 +1,92 @@
+1
+00:00:00,000 --> 00:00:09,000
+So let's name this wall type that we just worked on last video. Let's call it
+
+2
+00:00:09,000 --> 00:00:24,080
+8 inch concrete wall. So let's bring in a material for the sheathing here. If you
+
+3
+00:00:24,080 --> 00:00:30,159
+remember here's our material library with the two materials that we created.
+
+4
+00:00:30,159 --> 00:00:39,320
+I've over the years have created a similar library for projects or you know
+
+5
+00:00:39,320 --> 00:00:44,680
+the materials are saved in. So instead of just creating a new one from scratch I'm
+
+6
+00:00:44,680 --> 00:00:52,840
+gonna pull a material from this library over. So let's pick this one here it's
+
+7
+00:00:53,280 --> 00:01:03,560
+would OSB. Again just copy it go to your library and then copy into place. Zoom
+
+8
+00:01:03,560 --> 00:01:14,000
+out there it is okay and we're gonna save it and go to our working IFC file
+
+9
+00:01:14,000 --> 00:01:20,720
+there and we're gonna create a style.
+
+10
+00:01:23,840 --> 00:01:39,520
+External style and say OSB. Save select OSB go to external navigate to the file
+
+11
+00:01:39,520 --> 00:01:50,720
+it is in materials at one here and it's the one we just pulled in and save and
+
+12
+00:01:50,720 --> 00:02:01,920
+then go to our materials that was be and set the style or real sign style
+
+13
+00:02:01,920 --> 00:02:09,320
+hopefully it'll change there. So we copied that material from that larger
+
+14
+00:02:09,320 --> 00:02:15,160
+library into our library but we also if you remember we have to pull the
+
+15
+00:02:15,160 --> 00:02:22,799
+textures over as well. So if we click on the object or material that brought in
+
+16
+00:02:22,799 --> 00:02:30,640
+that's the name of the texture that we need to bring in. So this library here is
+
+17
+00:02:30,640 --> 00:02:36,320
+a library you know created over the years and it can be found here at this
+
+18
+00:02:36,320 --> 00:02:42,440
+location. All the textures in it are open source and they're pulled from
+
+19
+00:02:42,440 --> 00:02:49,400
+these three material libraries and so feel free to sync this library or add to
+
+20
+00:02:49,400 --> 00:02:57,200
+it or modify it. I've synced it that repo locally here and so I just got to
+
+21
+00:02:57,200 --> 00:03:04,240
+navigate to where those textures are and I believe it's these here and so we got
+
+22
+00:03:04,240 --> 00:03:16,080
+to go back to our location here and paste those textures in the project
+
+23
+00:03:16,080 --> 00:03:19,400
+folder there.
+
diff --git a/069000_20250226_1738 - Adding strip footings/069000_20250226_1738 - Adding strip footings.srt b/069000_20250226_1738 - Adding strip footings/069000_20250226_1738 - Adding strip footings.srt
new file mode 100644
index 0000000..8753b87
--- /dev/null
+++ b/069000_20250226_1738 - Adding strip footings/069000_20250226_1738 - Adding strip footings.srt
@@ -0,0 +1,252 @@
+1
+00:00:00,000 --> 00:00:03,000
+So let's add a strip footing to this project
+
+2
+00:00:04,680 --> 00:00:11,120
+Before we do we got to create a profile which we're going to use then in the extrusion for the strip footing
+
+3
+00:00:11,560 --> 00:00:13,920
+Sort of create a new profile you go here
+
+4
+00:00:15,880 --> 00:00:21,600
+Click on this drop down you can see all the different types of profiles that IFC offers
+
+5
+00:00:22,360 --> 00:00:24,860
+We're just going to use a rectangular profile there
+
+6
+00:00:25,560 --> 00:00:27,520
+click new
+
+7
+00:00:27,520 --> 00:00:32,240
+It has new profile here, and you can just name it 8 inch by say 24 inch
+
+8
+00:00:33,200 --> 00:00:34,920
+footing
+
+9
+00:00:34,920 --> 00:00:36,960
+and then use this pencil to
+
+10
+00:00:39,879 --> 00:00:44,960
+Add in additional information so we'll do 8 inch and
+
+11
+00:00:46,760 --> 00:00:48,760
+Save it
+
+12
+00:00:49,200 --> 00:00:51,420
+So to create a footing
+
+13
+00:00:52,820 --> 00:00:56,560
+You notice there is currently no footing tool
+
+14
+00:00:57,560 --> 00:01:03,840
+So anytime there's not a dedicated tool that you see here use this one is the multi-object tool
+
+15
+00:01:04,440 --> 00:01:09,760
+so click on that and then go up to launch your types again and
+
+16
+00:01:10,420 --> 00:01:12,420
+We're gonna create a new type
+
+17
+00:01:12,720 --> 00:01:15,080
+And we're gonna call it 8 inch
+
+18
+00:01:15,680 --> 00:01:17,680
+by 24 inch
+
+19
+00:01:18,240 --> 00:01:20,240
+footing
+
+20
+00:01:20,680 --> 00:01:21,880
+And
+
+21
+00:01:21,880 --> 00:01:23,880
+we're it is a
+
+22
+00:01:24,520 --> 00:01:26,480
+IFC footing type and
+
+23
+00:01:26,480 --> 00:01:27,600
+the
+
+24
+00:01:27,600 --> 00:01:34,520
+predefined will be a strip footing and then for representation we're gonna do extruded profile and
+
+25
+00:01:35,080 --> 00:01:38,480
+in here then you can pick the profile that we just made and
+
+26
+00:01:39,640 --> 00:01:41,640
+Context will keep that context
+
+27
+00:01:42,120 --> 00:01:43,760
+so
+
+28
+00:01:43,760 --> 00:01:51,160
+We'll close that and yep, that's active so we're gonna add it in in world and again. We're gonna make sure
+
+29
+00:01:52,720 --> 00:01:55,740
+Our basement is our basement active
+
+30
+00:01:56,960 --> 00:01:59,860
+Basement we're gonna set that default, okay
+
+31
+00:02:01,520 --> 00:02:03,860
+And so we can edit in world then
+
+32
+00:02:11,080 --> 00:02:13,680
+Our dimensions are off we can fix that later
+
+33
+00:02:17,000 --> 00:02:19,160
+And then close for C
+
+34
+00:02:19,160 --> 00:02:21,160
+You
+
+35
+00:02:22,040 --> 00:02:28,040
+Can see our aspect ratio is wrong my I got the dimensions wrong, so let's go back to our profile
+
+36
+00:02:28,920 --> 00:02:30,320
+and
+
+37
+00:02:30,320 --> 00:02:32,120
+edit
+
+38
+00:02:32,120 --> 00:02:35,280
+Her dimensions so this one should be two foot
+
+39
+00:02:36,680 --> 00:02:38,680
+This one is eight
+
+40
+00:02:39,920 --> 00:02:42,800
+And say okay and everything should update
+
+41
+00:02:44,640 --> 00:02:48,680
+Similar again you do the shift G and everything mends itself
+
+42
+00:02:49,640 --> 00:02:51,799
+I'm gonna turn on wireframe
+
+43
+00:02:54,000 --> 00:02:58,980
+So we have to move this down I'm gonna use my shift right click put my cursor
+
+44
+00:02:59,500 --> 00:03:02,720
+3d cursor right there, and I'm gonna drag this down
+
+45
+00:03:03,320 --> 00:03:05,320
+You notice how it doesn't drag
+
+46
+00:03:05,880 --> 00:03:09,079
+snap to what you would think it would snap to
+
+47
+00:03:10,280 --> 00:03:13,660
+We need to change a setting it in our snap to
+
+48
+00:03:14,600 --> 00:03:18,600
+Center now if we do our base point pull down
+
+49
+00:03:19,720 --> 00:03:21,960
+It aligns how you would expect
+
+50
+00:03:24,600 --> 00:03:26,600
+So
+
+51
+00:03:29,900 --> 00:03:36,560
+We need now to move this in four inches I believe
+
+52
+00:03:38,800 --> 00:03:45,560
+So to do that all in one go you can select all the types
+
+53
+00:03:46,560 --> 00:03:48,560
+And
+
+54
+00:03:48,560 --> 00:03:53,440
+We're gonna G type G to move and then we're gonna either do X
+
+55
+00:03:54,240 --> 00:03:57,040
+now I gotta switch this to local and
+
+56
+00:03:58,280 --> 00:04:03,760
+Individual origins so group again X and see how everything's moving
+
+57
+00:04:05,160 --> 00:04:07,920
+Inward or outward we need to go
+
+58
+00:04:07,920 --> 00:04:15,560
+Four inches in and then shift G again to mend everything
+
+59
+00:04:19,599 --> 00:04:22,400
+There we go we got a footing and so to add
+
+60
+00:04:24,159 --> 00:04:29,320
+Materials to that then again similar interface you go here
+
+61
+00:04:29,320 --> 00:04:31,320
+Click
+
+62
+00:04:33,520 --> 00:04:37,640
+On that and we're going to assign it to concrete footing
+
+63
+00:04:41,240 --> 00:04:43,240
+There you
+
diff --git a/070000_20250227_0930 - Thickened edge with custom profile/070000_20250227_0930 - Thickened edge with custom profile.srt b/070000_20250227_0930 - Thickened edge with custom profile/070000_20250227_0930 - Thickened edge with custom profile.srt
new file mode 100644
index 0000000..eec222f
--- /dev/null
+++ b/070000_20250227_0930 - Thickened edge with custom profile/070000_20250227_0930 - Thickened edge with custom profile.srt
@@ -0,0 +1,100 @@
+1
+00:00:00,000 --> 00:00:05,040
+So we're going to create a thickened slab that will be an extrusion made with a custom profile.
+
+2
+00:00:06,320 --> 00:00:11,120
+So we're going to make the profile first, put our 3D cursor somewhere into space.
+
+3
+00:00:11,120 --> 00:00:18,400
+I'm just going to add a simple plane, tab into it. I'm going to move these vertices up here to zero
+
+4
+00:00:18,400 --> 00:00:25,920
+and move them down to negative eight inches. Move that one over four inches
+
+5
+00:00:25,920 --> 00:00:35,920
+and move that one over negative four inches. Tab out of it. Go up to your material tab there.
+
+6
+00:00:35,920 --> 00:00:41,040
+We're going to go to profiles and we're going to use this arbitrary closed profile def.
+
+7
+00:00:41,600 --> 00:00:43,680
+And we're going to pick the geometry that we're going to use.
+
+8
+00:00:44,480 --> 00:00:50,880
+And we're just going to pick the slab.
+
+9
+00:00:53,920 --> 00:00:58,400
+Okay, now that we've made it we can actually delete that geometry if we want.
+
+10
+00:01:00,720 --> 00:01:06,320
+And go to our slab tool here. Go up to our launcher. We're going to create a new one.
+
+11
+00:01:06,320 --> 00:01:09,520
+Thickened slab.
+
+12
+00:01:11,759 --> 00:01:17,440
+And it's going to be a base slab. And here we're going to use a extrusion profile,
+
+13
+00:01:17,440 --> 00:01:26,639
+the one we just made. Keep the context the same. And we're going to activate that one. Make that
+
+14
+00:01:26,640 --> 00:01:42,560
+active. And add it in world here. Grab that edge. There we go. Type y to lock the axis. I'm just
+
+15
+00:01:42,560 --> 00:01:55,200
+going to click there. Say enter. Zoom in on it. So you notice that our origin is not really aligned
+
+16
+00:01:55,200 --> 00:02:00,800
+with the profile. I'd like to have the bottom of the profile aligned with the origin.
+
+17
+00:02:00,800 --> 00:02:08,480
+So you can go back after the fact and modify the profile. Click that button.
+
+18
+00:02:09,920 --> 00:02:17,920
+And zoom into it. It has the profile edit mode off into space there. Select it. You can see the
+
+19
+00:02:17,920 --> 00:02:24,240
+origin of the profile there. We're just going to grab it and move it down. I think four inches.
+
+20
+00:02:25,440 --> 00:02:34,000
+Negative four inches. And then save it. And if you zoom out, I do believe
+
+21
+00:02:36,640 --> 00:02:37,839
+it should be correct.
+
+22
+00:02:41,040 --> 00:02:45,040
+So I'm just going to move this over then.
+
+23
+00:02:45,040 --> 00:02:52,320
+Do that edge. There we go. Let's turn on our materials.
+
+24
+00:02:54,720 --> 00:02:58,880
+And I'm going to set the material over here.
+
+25
+00:03:04,000 --> 00:03:04,880
+Save.
+
diff --git a/071000_20250228_1242 - Adding pipe segments/071000_20250228_1242 - Adding pipe segments.srt b/071000_20250228_1242 - Adding pipe segments/071000_20250228_1242 - Adding pipe segments.srt
new file mode 100644
index 0000000..de7c5e0
--- /dev/null
+++ b/071000_20250228_1242 - Adding pipe segments/071000_20250228_1242 - Adding pipe segments.srt
@@ -0,0 +1,164 @@
+1
+00:00:00,000 --> 00:00:04,440
+So if you remember last time we assigned we got lazy and signed concrete footing
+
+2
+00:00:04,440 --> 00:00:09,840
+to this wall so let's actually create a new material and fix that.
+
+3
+00:00:09,840 --> 00:00:23,280
+I'm gonna do 8 inch concrete wall and then we're gonna change this to concrete wall.
+
+4
+00:00:23,280 --> 00:00:37,520
+Save. Save. Save. And apply a style to that material. Concrete style.
+
+5
+00:00:37,520 --> 00:00:42,640
+You'll notice this style that we have looks more like board formed which is
+
+6
+00:00:42,640 --> 00:00:51,160
+probably not realistic for formed and replaced concrete walls. So let's change that.
+
+7
+00:00:51,160 --> 00:00:57,000
+Let's add a new or change the style of concrete style. So here in that material
+
+8
+00:00:57,000 --> 00:01:02,080
+library and I was discussing in the last video I'm just gonna copy this material
+
+9
+00:01:02,080 --> 00:01:09,679
+over it's a little more realistic into our material library there and say save.
+
+10
+00:01:09,679 --> 00:01:15,560
+Then go back here and we want to just change the definition of the concrete
+
+11
+00:01:15,560 --> 00:01:22,960
+style definition. Select that. Go to external. Navigate to the file. This is
+
+12
+00:01:22,960 --> 00:01:30,600
+the new one we added and there you go. Makes it a little more realistic. So let's
+
+13
+00:01:30,600 --> 00:01:37,920
+now create a drain tile around the footing. To do that we first need to
+
+14
+00:01:37,920 --> 00:01:50,560
+create a profile and we're gonna use a circle profile and we're gonna say drain tile.
+
+15
+00:01:50,560 --> 00:02:00,240
+And we're gonna edit it. And we're gonna do make it two inch radius.
+
+16
+00:02:01,080 --> 00:02:08,199
+And save. Then we'll go to the pipe tool here. Word of warning this pipe tool is
+
+17
+00:02:08,199 --> 00:02:16,440
+very glitchy and buggy. You will undoubtedly run into problems but let's
+
+18
+00:02:16,440 --> 00:02:23,440
+try to tackle it and see what problems might pop up. So we are going to create a
+
+19
+00:02:23,560 --> 00:02:33,960
+new pipe segment. I'm just gonna name it drain tile and the closest would be
+
+20
+00:02:33,960 --> 00:02:41,160
+gutter for what we're trying to do. And extruded profile and drain tile we just
+
+21
+00:02:41,160 --> 00:02:53,200
+created that. So say okay. Okay that's the and add it in. And click there.
+
+22
+00:02:53,200 --> 00:02:55,920
+Click there.
+
+23
+00:03:02,760 --> 00:03:06,239
+And then close at C.
+
+24
+00:03:06,240 --> 00:03:18,920
+And gonna grab it move it up two inches.
+
+25
+00:03:18,920 --> 00:03:29,440
+And then individually move it out.
+
+26
+00:03:37,799 --> 00:03:44,040
+All right this is where it gets kind of glitchy. So if I take two joints here or
+
+27
+00:03:44,040 --> 00:03:53,359
+two segments and go to the tool and I'm gonna add fitting. It seems to work there.
+
+28
+00:03:53,359 --> 00:04:01,079
+I'm just gonna keep doing it here add fitting. Okay add fitting.
+
+29
+00:04:01,080 --> 00:04:18,560
+Okay see there kind of wigs out. If that happens what I've done in the past is
+
+30
+00:04:18,560 --> 00:04:26,160
+take one of these segments and flip it and then delete the fitting and select
+
+31
+00:04:26,160 --> 00:04:35,720
+the both and try to do it again. I'm just gonna save this right now.
+
+32
+00:04:35,720 --> 00:04:42,200
+You might run into problems where if you move this segment out another foot let's
+
+33
+00:04:42,200 --> 00:04:51,680
+say you have to delete the segments before you can create them anew again.
+
+34
+00:04:51,680 --> 00:04:57,760
+So I'm gonna add putting sometimes you'll run into errors when you do this.
+
+35
+00:04:57,760 --> 00:05:08,600
+Let's see what happens. And it seems like it's working so far. Be warned however.
+
+36
+00:05:08,600 --> 00:05:23,040
+Oh there's and I'm not quite sure where that error is coming from. It's been
+
+37
+00:05:23,040 --> 00:05:32,960
+posted on github. This is where you post issues if you're ever wondering. Go to
+
+38
+00:05:32,960 --> 00:05:39,479
+issues here. If you ever run into an error you click on new issue and
+
+39
+00:05:39,479 --> 00:05:47,359
+basically describe what happened copy and paste the error code and kind of any
+
+40
+00:05:47,359 --> 00:05:53,380
+files if you can that are associated with that problem. Just part of open
+
+41
+00:05:53,380 --> 00:05:55,919
+source software.
+
diff --git a/072000_20250228_1356 - Alternate approach to a pipe/072000_20250228_1356 - Alternate approach to a pipe.srt b/072000_20250228_1356 - Alternate approach to a pipe/072000_20250228_1356 - Alternate approach to a pipe.srt
new file mode 100644
index 0000000..0891b04
--- /dev/null
+++ b/072000_20250228_1356 - Alternate approach to a pipe/072000_20250228_1356 - Alternate approach to a pipe.srt
@@ -0,0 +1,124 @@
+1
+00:00:00,000 --> 00:00:04,640
+So if you remember that last video we had problems errors connecting these segments and
+
+2
+00:00:05,400 --> 00:00:12,640
+When I open the ISC file a new you can see that these fittings are corrupted. I'm not sure what's going on there, but I
+
+3
+00:00:13,800 --> 00:00:18,900
+Am actually not gonna use pipe segments because it's too glitchy. I'm gonna
+
+4
+00:00:19,680 --> 00:00:21,600
+Select all those types
+
+5
+00:00:21,600 --> 00:00:23,720
+Delete them select all those types and delete them
+
+6
+00:00:24,520 --> 00:00:27,280
+So I'll show you a workaround for that
+
+7
+00:00:28,160 --> 00:00:30,040
+Let's go
+
+8
+00:00:30,040 --> 00:00:34,800
+Type launcher create a new type name it drain tile
+
+9
+00:00:36,000 --> 00:00:38,000
+and I'm gonna search for
+
+10
+00:00:39,200 --> 00:00:41,680
+I've see building element proxy type
+
+11
+00:00:42,120 --> 00:00:47,980
+that's essentially a way to categorize an object that you don't know how to categorize it's kind of the
+
+12
+00:00:49,060 --> 00:00:52,040
+bucket where you put everything you don't know how to organize and
+
+13
+00:00:53,080 --> 00:00:55,080
+We can say user find
+
+14
+00:00:57,400 --> 00:01:00,560
+Pre-defined type we'll just do name it drain tile again
+
+15
+00:01:02,200 --> 00:01:07,800
+And go extruded profile and drain tile
+
+16
+00:01:09,800 --> 00:01:13,960
+Okay close and add it in world
+
+17
+00:01:27,920 --> 00:01:29,920
+Cool see
+
+18
+00:01:32,000 --> 00:01:34,000
+Alright
+
+19
+00:01:35,480 --> 00:01:37,480
+Move it down
+
+20
+00:01:42,720 --> 00:01:44,720
+Negative two inches
+
+21
+00:01:46,360 --> 00:01:49,200
+And move it out G
+
+22
+00:01:49,960 --> 00:01:51,100
+X
+
+23
+00:01:51,100 --> 00:01:53,100
+2x hit X twice
+
+24
+00:01:53,699 --> 00:01:59,619
+Till it's moving and then I'll do I don't know negative six inches and
+
+25
+00:02:00,460 --> 00:02:02,460
+Then we can generate
+
+26
+00:02:03,300 --> 00:02:06,720
+Shift G and it connects all the segments again
+
+27
+00:02:08,180 --> 00:02:10,180
+So just a little workaround
+
+28
+00:02:13,060 --> 00:02:19,940
+And we can create a new material to assign to it for inch drain tile
+
+29
+00:02:19,940 --> 00:02:21,940
+Drain tile
+
+30
+00:02:22,340 --> 00:02:24,840
+Drain to sump
+
+31
+00:02:28,020 --> 00:02:33,300
+Okay, and then change the assignment here
+
diff --git a/073000_20250228_1504 - Different way to select things and a little model clean up/073000_20250228_1504 - Different way to select things and a little model clean up.srt b/073000_20250228_1504 - Different way to select things and a little model clean up/073000_20250228_1504 - Different way to select things and a little model clean up.srt
new file mode 100644
index 0000000..c990da7
--- /dev/null
+++ b/073000_20250228_1504 - Different way to select things and a little model clean up/073000_20250228_1504 - Different way to select things and a little model clean up.srt
@@ -0,0 +1,116 @@
+1
+00:00:00,000 --> 00:00:05,360
+So you can see off camera I introduced more of these drain tiles so inside and outside the
+
+2
+00:00:05,360 --> 00:00:11,840
+footer there and then I created these bleeders to connect the two drain tiles together.
+
+3
+00:00:12,880 --> 00:00:19,840
+I also introduced this thickened slab here which is runs underneath the wall next to the stair
+
+4
+00:00:20,560 --> 00:00:23,360
+because there'll be some load extra load coming down on that.
+
+5
+00:00:23,360 --> 00:00:30,160
+I also created some new materials that I applied to this drain tile.
+
+6
+00:00:31,680 --> 00:00:39,120
+So if you select one of those and go to perform quantity takeoff let's just see what happens.
+
+7
+00:00:39,120 --> 00:00:44,480
+So under the IFC open shell engine it doesn't work but let's go to the blender one.
+
+8
+00:00:45,280 --> 00:00:51,760
+So okay that works so I'm going to select all those types and then run that again.
+
+9
+00:00:53,920 --> 00:01:03,519
+So let's create a new type for these these bleeders based on the existing drain tile.
+
+10
+00:01:03,519 --> 00:01:11,200
+So select the type and then duplicate the type and you'll see over here that it duplicated it
+
+11
+00:01:11,200 --> 00:01:19,280
+and put a zero zero one on it. I think you can double click here and change it.
+
+12
+00:01:19,280 --> 00:01:26,000
+Let's do drain tile bleeders.
+
+13
+00:01:28,480 --> 00:01:35,360
+Okay now we can select that and because all these shorter segments have the same volume
+
+14
+00:01:35,360 --> 00:01:40,160
+you can click on that and hopefully all the shorter segments get selected.
+
+15
+00:01:41,120 --> 00:01:47,280
+And now we can change the type of those we can do the drain tile bleeders say okay.
+
+16
+00:01:49,680 --> 00:01:52,800
+So now we can select by just that type.
+
+17
+00:01:53,840 --> 00:01:56,640
+Yep there we go select by that type.
+
+18
+00:01:58,320 --> 00:02:02,000
+Now let's make sure all our objects are in the right container.
+
+19
+00:02:04,000 --> 00:02:06,880
+Let's click on this the first floor and see what's in there.
+
+20
+00:02:06,880 --> 00:02:12,000
+Oh okay so some of the stuff is not assigned correctly.
+
+21
+00:02:12,000 --> 00:02:20,240
+So okay so I'm just gonna select all those types and actually you can select more than one type at
+
+22
+00:02:20,240 --> 00:02:25,600
+a time and I'm going to change those to basement.
+
+23
+00:02:26,480 --> 00:02:32,000
+Say okay and I'm going to hide them just so I know they're organized.
+
+24
+00:02:34,000 --> 00:02:36,560
+Actually I'm going to select everything in basement I'm going to hide all the other
+
+25
+00:02:36,560 --> 00:02:37,280
+they're organized.
+
+26
+00:02:39,600 --> 00:02:44,400
+Actually I'm going to select everything in basement I'm going to hide it if it's correct.
+
+27
+00:02:46,160 --> 00:02:52,160
+Yes that is correct hide okay so these are not correct.
+
+28
+00:02:55,920 --> 00:02:58,000
+Okay let's switch those to basement.
+
+29
+00:03:01,120 --> 00:03:03,680
+Hide it okay that works better.
+
diff --git a/074000_20250228_1616 - Wall Tools/074000_20250228_1616 - Wall Tools.srt b/074000_20250228_1616 - Wall Tools/074000_20250228_1616 - Wall Tools.srt
new file mode 100644
index 0000000..10d6185
--- /dev/null
+++ b/074000_20250228_1616 - Wall Tools/074000_20250228_1616 - Wall Tools.srt
@@ -0,0 +1,180 @@
+1
+00:00:00,000 --> 00:00:05,340
+So off-camera I created two new styles this lumber style and then this drywall
+
+2
+00:00:05,340 --> 00:00:10,880
+style and I did that again by going to this standard library and I pulled these
+
+3
+00:00:10,880 --> 00:00:18,260
+two materials or copy those two materials over to our Blender material
+
+4
+00:00:18,260 --> 00:00:26,760
+library there and then I created these two new materials and then I attached
+
+5
+00:00:27,120 --> 00:00:36,120
+those styles to them. So let's create a new wall that has multiple layers in it.
+
+6
+00:00:36,120 --> 00:00:43,980
+So go to the wall tool and yeah we'll just start with wall 100 and we'll just
+
+7
+00:00:44,139 --> 00:00:58,140
+add it in space somewhere. So there's our wall and let's call it, rename it, just say
+
+8
+00:00:58,140 --> 00:01:13,620
+2x4. Just do interior interior 2x4. And right now it has default
+
+9
+00:01:13,940 --> 00:01:22,180
+layer of unknown here. I'll pull this out and we're gonna change material to that.
+
+10
+00:01:23,940 --> 00:01:38,660
+Do let's do here, board, okay and we're gonna change the layer thickness and now
+
+11
+00:01:38,700 --> 00:01:56,539
+we're gonna add a new layer and change the thickness of 3.5 inches. And we're
+
+12
+00:01:56,539 --> 00:01:59,979
+gonna take this half inch layer that we already created and we're gonna
+
+13
+00:01:59,979 --> 00:02:06,259
+duplicate it and now we're gonna move it down that layer down in the hierarchy or
+
+14
+00:02:06,260 --> 00:02:10,620
+the layering I should say. So you can see here a little helpful reminders
+
+15
+00:02:10,620 --> 00:02:15,420
+where it says exterior and interior just shows you where those layers are
+
+16
+00:02:15,420 --> 00:02:24,700
+relative to the outside or inside of the wall. So although we've added these three
+
+17
+00:02:24,700 --> 00:02:29,500
+layers and three materials associated with those layers we only in world we
+
+18
+00:02:29,500 --> 00:02:35,380
+only see the one material the drywall material. Unfortunately at this point
+
+19
+00:02:35,380 --> 00:02:41,019
+in time when a wall has multiple layers you don't see those layers in the 3d
+
+20
+00:02:41,019 --> 00:02:46,900
+viewport. However I think that's going to change pretty quickly. There's a
+
+21
+00:02:46,900 --> 00:02:51,700
+developer DNmolt that's working on that functionality as we speak so
+
+22
+00:02:51,700 --> 00:02:59,540
+hopefully you'll see that soon. But in the meantime so now that we have our new
+
+23
+00:02:59,540 --> 00:03:12,060
+wall we can go through some of the wall tools that you can use. So let's start
+
+24
+00:03:12,060 --> 00:03:18,940
+with this one here to the extend. If you put your 3d cursor anywhere in space and
+
+25
+00:03:18,940 --> 00:03:26,700
+click on extend it'll extend that wall to the 3d cursor. If you let's say it
+
+26
+00:03:26,700 --> 00:03:34,579
+will duplicate this and rotate it 90 or you can use this tool to rotate it's a
+
+27
+00:03:34,579 --> 00:03:41,700
+little helpful to rotate. So if you have a situation like this and you select
+
+28
+00:03:41,700 --> 00:03:48,940
+that and that wall the second and hits extend it takes that wall and extends it.
+
+29
+00:03:48,940 --> 00:03:53,899
+And now this has an intelligent connection to it so if you move that and
+
+30
+00:03:54,060 --> 00:03:59,420
+do shift G that it reestablishes that connection again so it's very useful.
+
+31
+00:03:59,420 --> 00:04:07,020
+Continuing down you select both these walls you could do the butt joint you
+
+32
+00:04:07,020 --> 00:04:15,460
+can see that or miter or if you don't like that you can unjoin them. Or if you
+
+33
+00:04:15,460 --> 00:04:24,900
+place a cursor on a wall and hit split it creates two walls and then as you
+
+34
+00:04:24,900 --> 00:04:35,580
+would imagine if you do merge I think it mends those walls into one. Here I'm going to move this out of the way.
+
+35
+00:04:35,580 --> 00:04:40,260
+You can see that little dot there that's the origin of the wall that shows you
+
+36
+00:04:40,260 --> 00:04:45,980
+kind of ultimately where the wall starts and you can do this to flip the
+
+37
+00:04:45,980 --> 00:04:50,820
+wall you can see the origin is over here.
+
+38
+00:04:52,700 --> 00:05:00,460
+I'm just gonna duplicate this one over and rotate a little bit with this and
+
+39
+00:05:00,460 --> 00:05:10,820
+rotate it a little bit. So these here allow you to align walls to another wall
+
+40
+00:05:10,820 --> 00:05:15,099
+or I think it works with another object as well so just to see how that works
+
+41
+00:05:15,099 --> 00:05:26,020
+click on the exterior and undo center undo interior undo and mirror.
+
+42
+00:05:26,020 --> 00:05:31,780
+It mirrors it around a second object so try that see what happens.
+
+43
+00:05:36,780 --> 00:05:41,419
+That works yeah there you go so it mirrors it around another object so you
+
+44
+00:05:41,419 --> 00:05:50,180
+can kind of play around with it to see how that works exactly.
+
+45
+00:05:50,180 --> 00:05:53,659
+I think that's about it we'll get into these later.
+
diff --git a/075000_20250303_1407 - An approach to naming wall types/075000_20250303_1407 - An approach to naming wall types.srt b/075000_20250303_1407 - An approach to naming wall types/075000_20250303_1407 - An approach to naming wall types.srt
new file mode 100644
index 0000000..3fb77ba
--- /dev/null
+++ b/075000_20250303_1407 - An approach to naming wall types/075000_20250303_1407 - An approach to naming wall types.srt
@@ -0,0 +1,200 @@
+1
+00:00:00,000 --> 00:00:08,000
+So a few things I did off camera. I created a new style here, GS installation rigid, and a new material.
+
+2
+00:00:08,000 --> 00:00:18,000
+And then I attached that style to that material. I also renamed a few of these materials here to, you know, prefix with the GS.
+
+3
+00:00:18,000 --> 00:00:28,000
+Reason being is that in kind of the standard library, a lot of these materials have a prefix of GS, meaning generic style.
+
+4
+00:00:28,000 --> 00:00:38,000
+And so I also, you know, brought over this material into our material library for this project.
+
+5
+00:00:38,000 --> 00:00:49,000
+I also, too, moved the slab and these footings and everything down a couple inches.
+
+6
+00:00:49,000 --> 00:00:56,000
+The reason being is that I'd like to use pre-cut studs in the basement.
+
+7
+00:00:57,000 --> 00:01:15,000
+Pre-cut studs, if you're not familiar, are studs that are cut exact length so that if you have a bottom plate and kind of two top plates, you can use a whole piece of drywall.
+
+8
+00:01:15,000 --> 00:01:21,000
+So in this detail here, you can put an eight-foot piece of drywall on it fits perfectly.
+
+9
+00:01:22,000 --> 00:01:26,000
+So that's why I kind of move things down.
+
+10
+00:01:27,000 --> 00:01:36,000
+So this wall here that I selected, we created that type in the last video. We called it interior two by four.
+
+11
+00:01:36,000 --> 00:01:42,000
+I'd like, if possible, to come up with a more consistent naming convention for these walls.
+
+12
+00:01:43,000 --> 00:01:52,000
+And I created this partition nomenclature wall, tag nomenclature, a couple of years back that I'd like to use.
+
+13
+00:01:52,000 --> 00:01:59,000
+It basically has five letters or numbers composed together to describe a wall.
+
+14
+00:01:59,000 --> 00:02:04,000
+So that first letter indicates what the material is, whether it's wood or metal.
+
+15
+00:02:04,000 --> 00:02:09,000
+The second number gives an indication of its thickness.
+
+16
+00:02:10,000 --> 00:02:16,000
+So if it's two by four or three and five-eighths metal stud.
+
+17
+00:02:17,000 --> 00:02:28,000
+The third one is basically the layers, how they're composed, where the core is basically from number one and then the layers on either side.
+
+18
+00:02:29,000 --> 00:02:32,000
+And the fourth position is the fire rating.
+
+19
+00:02:32,000 --> 00:02:44,000
+And the fifth position tells you how far the wall goes up to the structure beyond the structure to the deck, structural deck, for example.
+
+20
+00:02:44,000 --> 00:02:55,000
+And then here's kind of an example of a wall where M is metal, three five-eighths is, you know, the three and five-eighths inches.
+
+21
+00:02:55,000 --> 00:03:02,000
+Z goes back to how the layers are composed to each other.
+
+22
+00:03:03,000 --> 00:03:07,000
+The fourth position is the fire rating.
+
+23
+00:03:07,000 --> 00:03:10,000
+And again, the fifth position is the height.
+
+24
+00:03:10,000 --> 00:03:18,000
+And sometimes you'll go sixth and seventh position that describes a little more such that, you know, a furred out wall, for example.
+
+25
+00:03:19,000 --> 00:03:24,000
+So going back to our file here, we'll rename this type.
+
+26
+00:03:25,000 --> 00:03:30,000
+W4A0.
+
+27
+00:03:30,000 --> 00:03:33,000
+So wood, it's a two by four.
+
+28
+00:03:33,000 --> 00:03:35,000
+This describes the layering.
+
+29
+00:03:35,000 --> 00:03:37,000
+Zero rated.
+
+30
+00:03:37,000 --> 00:03:41,000
+And then it goes up to the bottom of the structure.
+
+31
+00:03:44,000 --> 00:03:50,000
+So if we want to create a new type, a two by six wall, duplicate that.
+
+32
+00:03:51,000 --> 00:03:53,000
+Move it out of position.
+
+33
+00:03:54,000 --> 00:03:55,000
+Select the type.
+
+34
+00:03:57,000 --> 00:03:58,000
+Duplicate the type.
+
+35
+00:04:00,000 --> 00:04:02,000
+And see if we can find it down here.
+
+36
+00:04:03,000 --> 00:04:09,000
+And we are going to rename it to six W6 instead.
+
+37
+00:04:14,000 --> 00:04:16,000
+And I'm going to switch the type on here.
+
+38
+00:04:18,000 --> 00:04:19,000
+W6.
+
+39
+00:04:20,000 --> 00:04:22,000
+Go to our layers.
+
+40
+00:04:22,000 --> 00:04:30,000
+And we're just going to change this to five point five inches for the two by six.
+
+41
+00:04:32,000 --> 00:04:35,000
+And I'm going to move it in position here.
+
+42
+00:04:35,000 --> 00:04:36,000
+G.
+
+43
+00:04:37,000 --> 00:04:43,000
+And I'm going to move it out, let's say, two inches.
+
+44
+00:04:43,000 --> 00:04:44,000
+Two inches.
+
+45
+00:04:45,000 --> 00:04:49,000
+And then I'm going to shift E. That extends that.
+
+46
+00:04:49,000 --> 00:04:52,000
+And then here I'm going to shift E to extend.
+
+47
+00:04:52,000 --> 00:04:53,000
+Oh, sorry.
+
+48
+00:04:54,000 --> 00:04:55,000
+Activate that tool.
+
+49
+00:04:56,000 --> 00:04:57,000
+And shift E.
+
+50
+00:04:58,000 --> 00:04:59,000
+And here, just shift E.
+
diff --git a/076000_20250303_1451 - Creating new beam type/076000_20250303_1451 - Creating new beam type.srt b/076000_20250303_1451 - Creating new beam type/076000_20250303_1451 - Creating new beam type.srt
new file mode 100644
index 0000000..98df277
--- /dev/null
+++ b/076000_20250303_1451 - Creating new beam type/076000_20250303_1451 - Creating new beam type.srt
@@ -0,0 +1,192 @@
+1
+00:00:00,000 --> 00:00:06,680
+So let's create a 2X ledger beam for the structure of the first floor.
+
+2
+00:00:06,680 --> 00:00:08,680
+I'm going to hide that sheathing.
+
+3
+00:00:08,680 --> 00:00:12,000
+I'm going to move this down from last time.
+
+4
+00:00:12,000 --> 00:00:15,600
+Get this dimension here.
+
+5
+00:00:15,600 --> 00:00:18,680
+Copy it in there.
+
+6
+00:00:18,680 --> 00:00:20,200
+Move the wall down.
+
+7
+00:00:20,200 --> 00:00:22,200
+There we go.
+
+8
+00:00:22,200 --> 00:00:25,880
+Alright, so let's start with creating a profile.
+
+9
+00:00:25,880 --> 00:00:31,960
+It's going to be a rectangular profile.
+
+10
+00:00:31,960 --> 00:00:36,000
+Say add.
+
+11
+00:00:36,000 --> 00:00:39,560
+Creates a new profile there.
+
+12
+00:00:39,560 --> 00:00:41,080
+Double click to rename it.
+
+13
+00:00:41,080 --> 00:00:48,400
+We're going to rename it rectangle 1.5 by 9.25 inches.
+
+14
+00:00:48,400 --> 00:00:53,599
+And we're going to change 1.5 inches.
+
+15
+00:00:53,600 --> 00:01:03,640
+And click on your beam tool there.
+
+16
+00:01:03,640 --> 00:01:05,560
+And we're going to go to the launcher.
+
+17
+00:01:05,560 --> 00:01:07,600
+Create a new type.
+
+18
+00:01:07,600 --> 00:01:15,320
+And we're going to name it this lumber 2 by 10 pressure treated.
+
+19
+00:01:15,320 --> 00:01:20,920
+We'll do a beam, yeah, sure.
+
+20
+00:01:20,920 --> 00:01:23,160
+And extrude profile.
+
+21
+00:01:23,160 --> 00:01:26,119
+And we'll pick the profile we just made.
+
+22
+00:01:26,119 --> 00:01:28,240
+Say okay.
+
+23
+00:01:28,240 --> 00:01:31,720
+And make it active.
+
+24
+00:01:31,720 --> 00:01:33,520
+And add it in the scene.
+
+25
+00:01:33,520 --> 00:01:43,880
+I'm going to change my, before I do that though, I'm going to change, oops, my snaps.
+
+26
+00:01:43,880 --> 00:01:49,960
+Alright, add it.
+
+27
+00:01:49,960 --> 00:01:56,039
+And C for claws.
+
+28
+00:01:56,039 --> 00:02:05,000
+And I don't want to need that one.
+
+29
+00:02:05,000 --> 00:02:08,639
+Or that one.
+
+30
+00:02:08,639 --> 00:02:09,639
+Okay.
+
+31
+00:02:09,639 --> 00:02:14,920
+And we want to give it a material too.
+
+32
+00:02:14,920 --> 00:02:22,280
+I forgot to mention too, off camera, I created a new style.
+
+33
+00:02:22,280 --> 00:02:26,679
+Which I pulled from that library and then created a new material too.
+
+34
+00:02:26,679 --> 00:02:30,880
+So I'm going to apply that.
+
+35
+00:02:30,880 --> 00:02:33,600
+And save.
+
+36
+00:02:33,600 --> 00:02:37,880
+There we go.
+
+37
+00:02:37,880 --> 00:02:38,880
+Okay.
+
+38
+00:02:38,880 --> 00:02:43,960
+And we are going to select the type.
+
+39
+00:02:43,960 --> 00:02:47,920
+No, that didn't mean that.
+
+40
+00:02:47,920 --> 00:02:51,519
+Select the type objects, okay.
+
+41
+00:02:51,519 --> 00:02:52,519
+And type G.
+
+42
+00:02:52,519 --> 00:02:57,120
+And I believe Y and Y, or no, X, X.
+
+43
+00:02:57,120 --> 00:02:58,120
+Okay.
+
+44
+00:02:58,120 --> 00:03:02,720
+Move them in a little, or move them out rather.
+
+45
+00:03:02,720 --> 00:03:03,720
+How far?
+
+46
+00:03:03,720 --> 00:03:07,720
+An inch I believe.
+
+47
+00:03:07,720 --> 00:03:24,600
+Grab the top of that, line it there, and I believe it goes up one half inches, 1.5 inches.
+
+48
+00:03:24,600 --> 00:03:28,440
+Alright, there's our ledger beam.
+
diff --git a/076000_20250303_1521 - Creating a recess in a wall/076000_20250303_1521 - Creating a recess in a wall.srt b/076000_20250303_1521 - Creating a recess in a wall/076000_20250303_1521 - Creating a recess in a wall.srt
new file mode 100644
index 0000000..ac59faf
--- /dev/null
+++ b/076000_20250303_1521 - Creating a recess in a wall/076000_20250303_1521 - Creating a recess in a wall.srt
@@ -0,0 +1,124 @@
+1
+00:00:00,000 --> 00:00:05,400
+So in the last video I actually placed this ledger board incorrectly. It's
+
+2
+00:00:05,400 --> 00:00:10,280
+actually moved over and the outer edge is flush with the edge of the concrete.
+
+3
+00:00:10,280 --> 00:00:14,680
+There's kind of a detail where that's the concrete wall and then here's the
+
+4
+00:00:14,680 --> 00:00:22,520
+ledger that's actually going to sit in a little pocket. So I'm going to move those.
+
+5
+00:00:22,520 --> 00:00:40,280
+Let's select all the types. Type G and X here and 1.75 inches.
+
+6
+00:00:40,280 --> 00:00:48,600
+And shift G to regenerate the corners and I think we might have to
+
+7
+00:00:48,600 --> 00:00:59,720
+trim these up here. Select that ledger board. Shift and shift E extend.
+
+8
+00:01:06,840 --> 00:01:13,200
+Okay so like I said in that detail there's like a little recess or a little
+
+9
+00:01:13,200 --> 00:01:21,960
+pocket for this ledger board to sit in. Let's create that using a void. So let me
+
+10
+00:01:21,960 --> 00:01:32,200
+just select all these types here and I'm gonna isolate just those walls and put
+
+11
+00:01:32,200 --> 00:01:39,120
+the 3d cursor in the corner there. Go up to add IFC object and we'll say ledger
+
+12
+00:01:39,120 --> 00:01:51,920
+void recess maybe better. We just created an oh sorry we want to do IFC
+
+13
+00:01:51,920 --> 00:01:56,120
+feature element. We've never done that before. That's where you you get your
+
+14
+00:01:56,120 --> 00:02:03,120
+voids and we're gonna use IFC opening element for the void and recess and we
+
+15
+00:02:03,120 --> 00:02:09,480
+want it for to start we want to carve it out of that object and we're going to do
+
+16
+00:02:09,480 --> 00:02:18,000
+custom extrusion. Say okay and now we're gonna tab into it. I'm just gonna move
+
+17
+00:02:18,000 --> 00:02:29,600
+these over and I'm just going to shift D that corner place it there and then I'm
+
+18
+00:02:29,600 --> 00:02:37,040
+gonna do E which is extrude essentially. I'm just gonna keep extruding this.
+
+19
+00:02:41,040 --> 00:02:49,680
+I'm gonna delete this then and I'm just gonna tab into it okay and tab back into
+
+20
+00:02:49,680 --> 00:02:56,120
+it and select all the edges.
+
+21
+00:03:01,040 --> 00:03:13,840
+I'm gonna go negative 1.5 inches. Okay I'm gonna ctrl L and select all those
+
+22
+00:03:13,840 --> 00:03:22,440
+inner edges and delete and tab out of it again. Then I want to move this down
+
+23
+00:03:22,440 --> 00:03:42,320
+negative 7.75 inches and tab out of it and finally then edit openings and you
+
+24
+00:03:42,320 --> 00:03:47,760
+can see there's our recess there. So to apply that same void to the other walls
+
+25
+00:03:47,760 --> 00:03:52,720
+there's you have to create an aggregate out of the walls you'd like to avoid
+
+26
+00:03:52,720 --> 00:04:04,079
+first. So I'm gonna create an aggregate out of those say new and walls with
+
+27
+00:04:04,080 --> 00:04:19,520
+pleasure. Okay and we want to toggle openings and select the aggregate by
+
+28
+00:04:19,520 --> 00:04:27,360
+this little icon here and then shift select the void and then apply void and
+
+29
+00:04:27,360 --> 00:04:32,440
+you can see that void then is applied to the aggregate with all those walls in it.
+
+30
+00:04:32,440 --> 00:04:41,480
+And if you toggle the local view then zoom in here you can see our ledger board
+
+31
+00:04:41,480 --> 00:04:43,680
+which I'll move out of the way and then the recess there.
+
diff --git a/077000_20250303_1601 - Working with Arrays/077000_20250303_1601 - Working with Arrays.srt b/077000_20250303_1601 - Working with Arrays/077000_20250303_1601 - Working with Arrays.srt
new file mode 100644
index 0000000..4fb014e
--- /dev/null
+++ b/077000_20250303_1601 - Working with Arrays/077000_20250303_1601 - Working with Arrays.srt
@@ -0,0 +1,324 @@
+1
+00:00:00,000 --> 00:00:06,480
+So let's put some wood I beams on the first floor here. They're called TJ eyes
+
+2
+00:00:07,680 --> 00:00:10,200
+They look like this. I think this Sam for
+
+3
+00:00:12,080 --> 00:00:15,220
+Truss Joyce I Joyce or I beams
+
+4
+00:00:18,120 --> 00:00:20,120
+So off-camera I
+
+5
+00:00:20,920 --> 00:00:28,520
+Created a new material TGI and then I connected this style here though a speed style to that material
+
+6
+00:00:28,520 --> 00:00:30,439
+I
+
+7
+00:00:30,439 --> 00:00:32,040
+also
+
+8
+00:00:32,040 --> 00:00:34,040
+modeled this plane
+
+9
+00:00:34,400 --> 00:00:38,240
+it looks like the profile of one of those I Joyce and
+
+10
+00:00:39,040 --> 00:00:42,120
+I'm gonna create a custom profile from that
+
+11
+00:00:43,000 --> 00:00:44,120
+so
+
+12
+00:00:44,120 --> 00:00:46,120
+Go down to our profiles
+
+13
+00:00:47,640 --> 00:00:49,640
+And
+
+14
+00:00:53,519 --> 00:00:57,540
+Click on this object to pick it up and plus
+
+15
+00:00:58,880 --> 00:01:02,160
+Rename it TGI nine and a half inches
+
+16
+00:01:06,080 --> 00:01:08,080
+We are going to
+
+17
+00:01:09,360 --> 00:01:11,360
+Create a new beam type
+
+18
+00:01:12,960 --> 00:01:14,960
+Call it the same thing
+
+19
+00:01:16,720 --> 00:01:18,720
+And it will be extrusion
+
+20
+00:01:20,000 --> 00:01:22,000
+TGI
+
+21
+00:01:22,000 --> 00:01:24,000
+Say okay
+
+22
+00:01:24,940 --> 00:01:26,940
+Make that active, okay
+
+23
+00:01:28,640 --> 00:01:31,119
+And we will place it in world here
+
+24
+00:01:41,060 --> 00:01:44,840
+Bring it down a little bit flush to the top of that ledger beam
+
+25
+00:01:49,120 --> 00:01:51,120
+Shifty
+
+26
+00:01:51,759 --> 00:01:57,759
+And I think that's good delete that it was just a placeholder and we're gonna give it a material
+
+27
+00:01:58,520 --> 00:02:00,520
+I
+
+28
+00:02:04,560 --> 00:02:06,560
+Sorry
+
+29
+00:02:07,280 --> 00:02:09,940
+Cheerio what did we call it we call that TGI?
+
+30
+00:02:12,400 --> 00:02:14,400
+Okay, okay
+
+31
+00:02:15,720 --> 00:02:17,720
+Okay now
+
+32
+00:02:18,120 --> 00:02:20,900
+Let's cover the array tool so we want to array that
+
+33
+00:02:21,720 --> 00:02:23,720
+TGI a certain dimension
+
+34
+00:02:24,200 --> 00:02:25,760
+so
+
+35
+00:02:26,239 --> 00:02:32,440
+Array tools found under parametric geometry an array. I'm gonna create it ray
+
+36
+00:02:33,799 --> 00:02:34,920
+and
+
+37
+00:02:34,920 --> 00:02:36,980
+It's green here. See the
+
+38
+00:02:37,760 --> 00:02:42,780
+Why the green and that's arrow here will actually switch it to local here
+
+39
+00:02:43,440 --> 00:02:48,640
+Actually, it's X. The red is X and we want to use the local space
+
+40
+00:02:51,959 --> 00:02:54,680
+I'm gonna do 16 inches 16 over 12
+
+41
+00:02:55,760 --> 00:03:00,739
+And do the count and see what happens. Oh, there we go
+
+42
+00:03:02,200 --> 00:03:04,200
+Maybe add some more
+
+43
+00:03:05,640 --> 00:03:07,640
+Do we get to that's
+
+44
+00:03:08,799 --> 00:03:12,940
+Stare next to the wall there which will support a shorter length TGI
+
+45
+00:03:17,280 --> 00:03:20,840
+They're setting that comes in handy on the ray tool
+
+46
+00:03:22,560 --> 00:03:24,640
+Is this sync children
+
+47
+00:03:25,160 --> 00:03:27,579
+if it's off and you
+
+48
+00:03:28,679 --> 00:03:30,679
+say you change the length and
+
+49
+00:03:31,799 --> 00:03:33,799
+Then change the number here
+
+50
+00:03:34,720 --> 00:03:41,119
+Only the new ones will take on that new length if you want all the objects in that array to take on
+
+51
+00:03:41,480 --> 00:03:43,619
+The original you sync children
+
+52
+00:03:44,959 --> 00:03:46,959
+And there you go
+
+53
+00:03:46,960 --> 00:03:48,960
+I
+
+54
+00:03:49,360 --> 00:03:51,360
+Send that out
+
+55
+00:03:51,840 --> 00:03:53,840
+Sync again
+
+56
+00:03:54,000 --> 00:03:56,000
+Goes back
+
+57
+00:03:56,040 --> 00:03:58,040
+So some other settings
+
+58
+00:03:58,160 --> 00:04:01,680
+you have to select the parent in order to change the
+
+59
+00:04:02,480 --> 00:04:07,380
+Array, but if you have one of the children here and you want to go back to the parent click on that
+
+60
+00:04:07,960 --> 00:04:12,360
+Or you can click on this to select all the children and the parent
+
+61
+00:04:12,360 --> 00:04:14,360
+This
+
+62
+00:04:14,600 --> 00:04:16,600
+Checkmark here will
+
+63
+00:04:16,720 --> 00:04:17,920
+basically
+
+64
+00:04:17,920 --> 00:04:25,040
+Do away with the array and but keep all the objects of the children in world and then this X will completely
+
+65
+00:04:26,400 --> 00:04:28,400
+Delete the ray all together and
+
+66
+00:04:29,280 --> 00:04:31,280
+Delete this children as well
+
+67
+00:04:31,480 --> 00:04:36,220
+So I'm just gonna try to duplicate. Oh, that's not gonna work. Okay
+
+68
+00:04:37,320 --> 00:04:39,320
+See if we can do this
+
+69
+00:04:39,840 --> 00:04:41,840
+Select all the children
+
+70
+00:04:42,400 --> 00:04:47,520
+And we're gonna just duplicate it or move it out off to the side
+
+71
+00:04:54,160 --> 00:04:56,160
+See change these here
+
+72
+00:04:58,240 --> 00:05:05,240
+Okay, great, so yes, you can duplicate it and it holds its array still a few other settings
+
+73
+00:05:07,680 --> 00:05:09,680
+You can use distribute
+
+74
+00:05:10,560 --> 00:05:13,520
+Where you set the distance of the last
+
+75
+00:05:16,000 --> 00:05:21,400
+Child and then the 9 the number count is distributed between that
+
+76
+00:05:22,320 --> 00:05:25,200
+You can also put your 3d cursor in
+
+77
+00:05:25,760 --> 00:05:30,940
+Space and click on this and it'll take on that dimension of that 3d cursor
+
+78
+00:05:33,200 --> 00:05:35,200
+Another nice feature
+
+79
+00:05:35,200 --> 00:05:43,320
+It again, there we go increase the count
+
+80
+00:05:51,000 --> 00:05:56,280
+And finally, I believe you can copy arrays
+
+81
+00:06:00,440 --> 00:06:02,440
+There we go
+
diff --git a/078000_20250304_1217 - Creating Parametric Stair/078000_20250304_1217 - Creating Parametric Stair.srt b/078000_20250304_1217 - Creating Parametric Stair/078000_20250304_1217 - Creating Parametric Stair.srt
new file mode 100644
index 0000000..a3a70a5
--- /dev/null
+++ b/078000_20250304_1217 - Creating Parametric Stair/078000_20250304_1217 - Creating Parametric Stair.srt
@@ -0,0 +1,344 @@
+1
+00:00:00,000 --> 00:00:03,520
+So let's create a parametric stair which is always fun
+
+2
+00:00:04,600 --> 00:00:07,840
+In prep for this I created two new styles
+
+3
+00:00:08,480 --> 00:00:10,480
+this plies and
+
+4
+00:00:10,920 --> 00:00:14,640
+This wood finish again. I pulled it over from the OD texture library and
+
+5
+00:00:15,400 --> 00:00:17,320
+then I apply the
+
+6
+00:00:17,320 --> 00:00:19,120
+applied the plies
+
+7
+00:00:19,120 --> 00:00:22,120
+style to a new material called LVL and
+
+8
+00:00:22,680 --> 00:00:26,840
+Then this finished style to maple stair tread
+
+9
+00:00:26,840 --> 00:00:28,840
+So
+
+10
+00:00:29,240 --> 00:00:36,280
+To create a new stair parametric stair go to the multi tool here go to the launcher create a new type
+
+11
+00:00:37,280 --> 00:00:39,480
+Just say basement stair
+
+12
+00:00:42,000 --> 00:00:44,540
+And we want to look for straight
+
+13
+00:00:45,840 --> 00:00:53,120
+What I've see stair flight type straight predefined type there and then the representation will do stair
+
+14
+00:00:54,320 --> 00:00:56,320
+close
+
+15
+00:00:57,680 --> 00:01:05,120
+The active and before we place it let's make sure our default level is basement
+
+16
+00:01:06,040 --> 00:01:08,040
+That default okay
+
+17
+00:01:08,400 --> 00:01:10,400
+It's added an old
+
+18
+00:01:12,520 --> 00:01:15,400
+Okay rotate it 90
+
+19
+00:01:18,920 --> 00:01:22,720
+Isolate a few of these things it's easier to
+
+20
+00:01:27,160 --> 00:01:28,400
+Okay
+
+21
+00:01:28,400 --> 00:01:32,380
+I'm gonna pull the Z dimension off that slab just tell us how
+
+22
+00:01:33,160 --> 00:01:36,520
+Tall that stair needs to be so I copy that
+
+23
+00:01:37,720 --> 00:01:39,720
+select the stair and
+
+24
+00:01:40,680 --> 00:01:43,440
+This is where you modify the parameters of the stair
+
+25
+00:01:45,140 --> 00:01:47,140
+So we're gonna put that height in there
+
+26
+00:01:48,920 --> 00:01:50,920
+And let's say we want three feet
+
+27
+00:01:52,280 --> 00:01:54,280
+And
+
+28
+00:01:56,840 --> 00:02:00,560
+We're gonna change the to wood and steel instead of concrete
+
+29
+00:02:03,120 --> 00:02:05,280
+Tread depth I would say about one inch
+
+30
+00:02:07,200 --> 00:02:09,320
+Nosing length 1.5 inches
+
+31
+00:02:10,280 --> 00:02:11,840
+tread run
+
+32
+00:02:11,840 --> 00:02:13,840
+10 inches and
+
+33
+00:02:13,840 --> 00:02:17,320
+Then I'm gonna adjust a number of treads here
+
+34
+00:02:17,880 --> 00:02:19,240
+until you see
+
+35
+00:02:19,240 --> 00:02:24,640
+This tread rise fall under point six six six, which is eight inches essentially
+
+36
+00:02:24,880 --> 00:02:29,540
+So I would just keep doing that you can see okay there were under eight inches
+
+37
+00:02:33,220 --> 00:02:35,220
+You can also
+
+38
+00:02:36,239 --> 00:02:38,359
+Lock this and change the
+
+39
+00:02:39,600 --> 00:02:41,380
+overall length
+
+40
+00:02:41,380 --> 00:02:43,600
+which then changes your
+
+41
+00:02:45,000 --> 00:02:50,119
+Your tread run, but I want to just make sure our tread run is
+
+42
+00:02:51,440 --> 00:02:53,440
+Ten inches so I'm not gonna do that
+
+43
+00:02:54,799 --> 00:03:00,839
+And three okay, and then if you want you can actually change these parameters to
+
+44
+00:03:01,920 --> 00:03:05,839
+Change the length or depth of the top and bottom
+
+45
+00:03:06,839 --> 00:03:10,220
+Treads which are sometimes unique conditions
+
+46
+00:03:11,560 --> 00:03:13,560
+But we won't do that
+
+47
+00:03:14,239 --> 00:03:20,959
+Okay, we can finish editing there and now we can apply material then so we'll apply that
+
+48
+00:03:22,279 --> 00:03:24,279
+maple stair tread material
+
+49
+00:03:24,760 --> 00:03:26,760
+And add it oh
+
+50
+00:03:29,079 --> 00:03:33,399
+Yes there are sometimes an error when you do this, so I'm gonna save the IFC file
+
+51
+00:03:34,880 --> 00:03:37,200
+And I'm gonna open it again
+
+52
+00:03:43,600 --> 00:03:45,600
+This air has been posted so
+
+53
+00:03:47,040 --> 00:03:49,519
+Let's see here how it did take it on but
+
+54
+00:03:51,279 --> 00:03:53,279
+Okay
+
+55
+00:03:54,640 --> 00:03:56,640
+I
+
+56
+00:04:01,200 --> 00:04:06,040
+Just gonna move it over get it relatively close into space here
+
+57
+00:04:10,399 --> 00:04:12,399
+All right
+
+58
+00:04:13,600 --> 00:04:20,279
+Let's create a stair stringer then I'm gonna duplicate this off into space somewhere
+
+59
+00:04:21,279 --> 00:04:23,280
+And
+
+60
+00:04:23,919 --> 00:04:28,799
+We're actually gonna use the stair parametric stair tool to create a stringer
+
+61
+00:04:30,280 --> 00:04:32,739
+We're gonna duplicate the type first here
+
+62
+00:04:35,919 --> 00:04:37,919
+There
+
+63
+00:04:38,960 --> 00:04:46,380
+Okay, I change type here to a copy I'm gonna change the
+
+64
+00:04:51,239 --> 00:04:53,239
+Okay
+
+65
+00:04:55,119 --> 00:05:01,239
+Copy the type or select the type again, and we are going to change
+
+66
+00:05:03,159 --> 00:05:05,159
+Class
+
+67
+00:05:07,000 --> 00:05:09,000
+Stringer
+
+68
+00:05:09,960 --> 00:05:15,000
+Stringer I've seen member type stringer and say reassign
+
+69
+00:05:15,760 --> 00:05:17,760
+Okay
+
+70
+00:05:19,440 --> 00:05:21,440
+And now we're gonna go
+
+71
+00:05:22,600 --> 00:05:24,120
+Modify
+
+72
+00:05:24,120 --> 00:05:25,920
+parametric stair
+
+73
+00:05:25,920 --> 00:05:27,480
+and this time
+
+74
+00:05:27,480 --> 00:05:30,680
+The width is going to be one point seven five inches
+
+75
+00:05:32,440 --> 00:05:40,280
+And we're going to change this to concrete which it's not obviously concrete, but it gives us the geometry that we're looking for and
+
+76
+00:05:41,200 --> 00:05:43,200
+And
+
+77
+00:05:43,880 --> 00:05:45,880
+Slab base was the parameter to
+
+78
+00:05:52,280 --> 00:05:54,320
+Okay there we go change the depth of it
+
+79
+00:05:55,039 --> 00:06:00,880
+so I'm trying to basically create a LVL stair stringer here and finish and
+
+80
+00:06:02,039 --> 00:06:04,039
+hopefully
+
+81
+00:06:04,919 --> 00:06:06,919
+We can
+
+82
+00:06:07,360 --> 00:06:10,760
+Change this to LVL without an error. We'll see
+
+83
+00:06:14,560 --> 00:06:21,140
+We get an error I'm gonna save again and see what happens
+
+84
+00:06:31,640 --> 00:06:33,640
+Try that assignment again
+
+85
+00:06:33,640 --> 00:06:35,640
+LVL
+
+86
+00:06:39,200 --> 00:06:46,120
+There it takes it on so another glitch hopefully to be addressed soon
+
diff --git a/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry.srt b/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry.srt
new file mode 100644
index 0000000..b62d9ad
--- /dev/null
+++ b/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry.srt
@@ -0,0 +1,176 @@
+1
+00:00:00,000 --> 00:00:04,500
+So off camera I composed the stair better added additional stringers
+
+2
+00:00:05,320 --> 00:00:08,360
+Kind of located it better in the house. I
+
+3
+00:00:09,000 --> 00:00:13,500
+Moved this wall a little bit adjusted these TG eyes here and then
+
+4
+00:00:14,200 --> 00:00:17,360
+Adjusted this overall or outline of the sheathing here
+
+5
+00:00:18,880 --> 00:00:24,440
+So the parametric tool for stairs is good for making things like stringers
+
+6
+00:00:25,280 --> 00:00:26,440
+but
+
+7
+00:00:26,440 --> 00:00:33,360
+Unfortunately at this point. It's not very good at making riser parts. You can make tread parts obviously, but not riser parts
+
+8
+00:00:33,760 --> 00:00:35,760
+But there's a clever way to do that
+
+9
+00:00:37,600 --> 00:00:44,880
+We're just going to convert it to dumb geometry to start so unlink it so now this is just vanilla geometry
+
+10
+00:00:47,800 --> 00:00:49,480
+Tab into it
+
+11
+00:00:49,480 --> 00:00:53,480
+I'm gonna select all and then I'm gonna go to clean up and
+
+12
+00:00:54,279 --> 00:00:57,879
+Dissolve limit dissolve gets rid of the triangulations there
+
+13
+00:00:59,480 --> 00:01:01,480
+Let's switch that to
+
+14
+00:01:02,400 --> 00:01:06,120
+Face selection, and I'm going to turn off x-ray there
+
+15
+00:01:07,280 --> 00:01:10,479
+And I'm gonna shift select these faces there
+
+16
+00:01:10,480 --> 00:01:12,480
+And
+
+17
+00:01:19,640 --> 00:01:25,320
+Up the 3d cursor there and I'll move it and I'm gonna squish it down to zero and
+
+18
+00:01:26,400 --> 00:01:28,200
+move it back
+
+19
+00:01:28,200 --> 00:01:30,200
+negative point seven five inches
+
+20
+00:01:32,320 --> 00:01:38,760
+Okay tab out of it and now we want to go and convert it to
+
+21
+00:01:39,760 --> 00:01:41,760
+To
+
+22
+00:01:42,720 --> 00:01:48,440
+The stair flight again and just use IFC element not type because this is just one instance here
+
+23
+00:01:49,400 --> 00:01:51,720
+If you had multiple of these stairs
+
+24
+00:01:52,800 --> 00:01:54,640
+throughout a project
+
+25
+00:01:54,640 --> 00:01:57,780
+You'd want to change it to a type, but we're only going to do one here, so
+
+26
+00:01:58,480 --> 00:02:00,480
+and you can assign and
+
+27
+00:02:03,800 --> 00:02:06,920
+Grab it by that point there and
+
+28
+00:02:09,639 --> 00:02:11,640
+Right there
+
+29
+00:02:12,799 --> 00:02:14,799
+There you go riser parts
+
+30
+00:02:15,519 --> 00:02:19,200
+So one thing I forgot to do is assign a material to these risers I
+
+31
+00:02:19,760 --> 00:02:27,480
+Opened this IFC file and new and you can see the material assignment wasn't correct, so let's fix that
+
+32
+00:02:28,519 --> 00:02:31,560
+So let's duplicate that material. It's all right
+
+33
+00:02:32,880 --> 00:02:34,880
+duplicate it
+
+34
+00:02:35,399 --> 00:02:37,399
+And name it riser
+
+35
+00:02:39,760 --> 00:02:42,239
+And then we can
+
+36
+00:02:43,799 --> 00:02:48,079
+Apply it here, so if it if you create a new material it doesn't show up here
+
+37
+00:02:50,120 --> 00:02:53,100
+It'll quirk you have to just save the file again
+
+38
+00:02:58,280 --> 00:03:04,720
+And assign all right so it didn't work here, and I think the reason why
+
+39
+00:03:06,480 --> 00:03:08,480
+Is because
+
+40
+00:03:08,760 --> 00:03:10,760
+We
+
+41
+00:03:12,399 --> 00:03:18,760
+Have a residual style applied to that let's try to remove that now. Yeah, that's it
+
+42
+00:03:20,440 --> 00:03:22,440
+Well just remove the styles
+
+43
+00:03:26,640 --> 00:03:28,980
+Unfortunately can't shift select those things but
+
+44
+00:03:38,760 --> 00:03:40,760
+You
+
diff --git a/080000_20250304_1723 - pulling in content or assets from other files/080000_20250304_1723 - pulling in content or assets from other files.srt b/080000_20250304_1723 - pulling in content or assets from other files/080000_20250304_1723 - pulling in content or assets from other files.srt
new file mode 100644
index 0000000..1189716
--- /dev/null
+++ b/080000_20250304_1723 - pulling in content or assets from other files/080000_20250304_1723 - pulling in content or assets from other files.srt
@@ -0,0 +1,184 @@
+1
+00:00:00,000 --> 00:00:07,360
+So let's model in a rim board at the end of these TGIs here, an LVL rim board.
+
+2
+00:00:07,360 --> 00:00:12,480
+So to do that we could do a similar approach where we create a new beam type, a new profile
+
+3
+00:00:12,480 --> 00:00:17,640
+type, and then assign that to the beam type.
+
+4
+00:00:17,640 --> 00:00:22,100
+But for this let's actually pull in content from an existing library.
+
+5
+00:00:22,100 --> 00:00:27,600
+So similar to Revit or Archicad, you don't have to model everything in new, you can actually
+
+6
+00:00:27,600 --> 00:00:32,600
+pull content in from existing libraries.
+
+7
+00:00:32,600 --> 00:00:41,180
+And so over the years I've created this library, or template rather, for Revit that has standard
+
+8
+00:00:41,180 --> 00:00:46,100
+walls and beams, stairs and windows and doors.
+
+9
+00:00:46,100 --> 00:00:54,860
+And I've been replicating that over the last year or so, replicating that in a bonsai template.
+
+10
+00:00:54,860 --> 00:00:58,500
+And so here you can see a bunch of beam types.
+
+11
+00:00:58,500 --> 00:01:06,980
+So let's actually from our file pull over a beam from that template.
+
+12
+00:01:06,980 --> 00:01:14,460
+So to do that you go to the project overview here, collapse that, go to project library,
+
+13
+00:01:14,460 --> 00:01:21,500
+click on the folder, and navigate to where the template is.
+
+14
+00:01:21,500 --> 00:01:24,500
+Select it.
+
+15
+00:01:25,060 --> 00:01:29,420
+You can pull in, you know, I've seen materials, profiles, and types.
+
+16
+00:01:29,420 --> 00:01:32,900
+We haven't covered presentation style yet.
+
+17
+00:01:32,900 --> 00:01:38,220
+So you want to click on the type, and we want a building type.
+
+18
+00:01:38,220 --> 00:01:44,900
+And we are going to pull in, let's do this one here, and then click on that paper clip.
+
+19
+00:01:44,900 --> 00:01:48,220
+So it pulls it into your project.
+
+20
+00:01:48,220 --> 00:01:57,780
+So now we can go to beam, and change the active one to this one, and then model it in the
+
+21
+00:01:57,780 --> 00:01:59,780
+world here.
+
+22
+00:01:59,780 --> 00:02:08,940
+Oops, that was the wrong one.
+
+23
+00:02:08,940 --> 00:02:09,940
+Sorry about that.
+
+24
+00:02:09,940 --> 00:02:11,940
+This is the one we want.
+
+25
+00:02:18,220 --> 00:02:22,220
+Okay.
+
+26
+00:02:22,220 --> 00:02:27,220
+So you can see the materials were not applied.
+
+27
+00:02:27,220 --> 00:02:43,220
+And if you go to styles, open that, you see that it actually duplicated a style.
+
+28
+00:02:43,220 --> 00:02:49,220
+Unfortunately that's an existing quirk right now with bonsai.
+
+29
+00:02:49,220 --> 00:02:57,220
+And there's a way sometimes where you can merge these two identical styles.
+
+30
+00:02:57,220 --> 00:03:03,220
+You go up to here, and go to purge data.
+
+31
+00:03:03,220 --> 00:03:08,220
+Sometimes you can merge identical under styles here.
+
+32
+00:03:08,220 --> 00:03:10,220
+And it will go back to one.
+
+33
+00:03:11,220 --> 00:03:13,220
+But that is not the case here.
+
+34
+00:03:13,220 --> 00:03:23,220
+So what I like to do in this scenario is find the one with the least number assigned to it, and then delete that.
+
+35
+00:03:23,220 --> 00:03:34,220
+And then reestablish, this is LVL rim board, that's the material on the type we just pulled in.
+
+36
+00:03:35,220 --> 00:03:41,220
+And we want to reestablish the style.
+
+37
+00:03:41,220 --> 00:03:44,220
+And it applies a sign.
+
+38
+00:03:44,220 --> 00:03:47,220
+There we go.
+
+39
+00:03:47,220 --> 00:03:52,220
+Let's move this in position here.
+
+40
+00:03:52,220 --> 00:03:55,220
+There we go.
+
+41
+00:03:55,220 --> 00:04:03,220
+So if you were curious to use these templates,
+
+42
+00:04:03,220 --> 00:04:07,220
+this is the location of the bonsai template here.
+
+43
+00:04:07,220 --> 00:04:09,220
+It's at that path.
+
+44
+00:04:09,220 --> 00:04:11,220
+That's the file right there.
+
+45
+00:04:11,220 --> 00:04:15,220
+And also too, here's the Revit template.
+
+46
+00:04:15,220 --> 00:04:21,220
+That's the path, or URL I should say, and that's the path there.
+
diff --git a/081000_20250307_1247 - Walls now show their layers/081000_20250307_1247 - Walls now show their layers.srt b/081000_20250307_1247 - Walls now show their layers/081000_20250307_1247 - Walls now show their layers.srt
new file mode 100644
index 0000000..19f90e9
--- /dev/null
+++ b/081000_20250307_1247 - Walls now show their layers/081000_20250307_1247 - Walls now show their layers.srt
@@ -0,0 +1,112 @@
+1
+00:00:00,000 --> 00:00:04,000
+So there's been some exciting developments with Bonsai recently.
+
+2
+00:00:04,000 --> 00:00:14,000
+All the walls now show the layers that compose them in the 3D scene.
+
+3
+00:00:14,000 --> 00:00:17,000
+You can see the drywall and the studs there.
+
+4
+00:00:17,000 --> 00:00:21,000
+So this is a new development just happened recently.
+
+5
+00:00:21,000 --> 00:00:28,000
+There might be some bugs related to it, but going forward I'm going to try to see if it works.
+
+6
+00:00:28,000 --> 00:00:37,000
+So in that instance then, we don't necessarily need to make an additional wall for the insulation.
+
+7
+00:00:37,000 --> 00:00:41,000
+We can actually just add another layer to that concrete wall.
+
+8
+00:00:41,000 --> 00:00:44,000
+So I'm going to try to do that.
+
+9
+00:00:44,000 --> 00:00:50,000
+Select it, go here, and we're going to search rigid.
+
+10
+00:00:50,000 --> 00:00:52,000
+Two inches.
+
+11
+00:00:52,000 --> 00:00:54,000
+Add it to the layers.
+
+12
+00:00:54,000 --> 00:00:58,000
+Going to move it up in space so it's on the exterior.
+
+13
+00:00:58,000 --> 00:01:00,000
+And it's two inches.
+
+14
+00:01:00,000 --> 00:01:02,000
+And save.
+
+15
+00:01:02,000 --> 00:01:04,000
+Save.
+
+16
+00:01:04,000 --> 00:01:08,000
+Alright, we'll select all those types.
+
+17
+00:01:08,000 --> 00:01:12,000
+Type G and then YY.
+
+18
+00:01:12,000 --> 00:01:15,000
+Oops, there we go.
+
+19
+00:01:15,000 --> 00:01:20,000
+And I'm going to move it out negative two inches.
+
+20
+00:01:21,000 --> 00:01:25,000
+And let's see here, see if Shift G works.
+
+21
+00:01:25,000 --> 00:01:29,000
+To mend the corners, just select these three.
+
+22
+00:01:29,000 --> 00:01:33,000
+Shift G, okay, Menzels, Menzat.
+
+23
+00:01:33,000 --> 00:01:36,000
+And Shift G here.
+
+24
+00:01:36,000 --> 00:01:40,000
+Alright.
+
+25
+00:01:40,000 --> 00:01:47,000
+So yeah, then we don't need ultimately this old insulation wall.
+
+26
+00:01:48,000 --> 00:01:51,000
+Select all the types.
+
+27
+00:01:51,000 --> 00:01:54,000
+And we can delete it, I believe.
+
+28
+00:01:54,000 --> 00:01:57,000
+Yeah, so let's do it.
+
diff --git a/082000_20250307_1338 - Pull in a wall type from template file and extending to slab/082000_20250307_1338 - Pull in a wall type from template file and extending to slab.srt b/082000_20250307_1338 - Pull in a wall type from template file and extending to slab/082000_20250307_1338 - Pull in a wall type from template file and extending to slab.srt
new file mode 100644
index 0000000..21d6c08
--- /dev/null
+++ b/082000_20250307_1338 - Pull in a wall type from template file and extending to slab/082000_20250307_1338 - Pull in a wall type from template file and extending to slab.srt
@@ -0,0 +1,112 @@
+1
+00:00:00,000 --> 00:00:10,140
+So let's pull in a new FERD wall type to align on the inside of this concrete wall here.
+
+2
+00:00:10,140 --> 00:00:17,680
+So again we're going to use this OD project template file which is located here.
+
+3
+00:00:17,680 --> 00:00:19,240
+I've opened it.
+
+4
+00:00:19,240 --> 00:00:22,800
+So here's the number of wall types you can see standard wall types in that template and
+
+5
+00:00:22,800 --> 00:00:26,920
+we're going to pull in this one here.
+
+6
+00:00:26,920 --> 00:00:33,480
+We can go and just copy this because we're going to need that.
+
+7
+00:00:33,480 --> 00:00:47,040
+So in our project file we go to project library, navigate to that file and go to IFC wall product
+
+8
+00:00:47,040 --> 00:00:54,120
+type there and we're going to search for that.
+
+9
+00:00:54,640 --> 00:00:56,839
+Add it to the scene.
+
+10
+00:00:56,839 --> 00:00:58,419
+Make that active.
+
+11
+00:00:58,419 --> 00:01:02,080
+Make sure your basement is set to default.
+
+12
+00:01:02,080 --> 00:01:06,400
+And then add it in world.
+
+13
+00:01:06,400 --> 00:01:14,320
+Oh we didn't make it active now did we?
+
+14
+00:01:14,320 --> 00:01:18,320
+Well let's change it after the fact.
+
+15
+00:01:18,320 --> 00:01:21,080
+How about that.
+
+16
+00:01:21,080 --> 00:01:24,360
+What's that one?
+
+17
+00:01:24,360 --> 00:01:26,520
+Yes, okay great.
+
+18
+00:01:26,520 --> 00:01:29,720
+I'm going to turn everything on again.
+
+19
+00:01:29,720 --> 00:01:33,400
+Shift click.
+
+20
+00:01:33,400 --> 00:01:41,720
+And then you can select the wall and then that sheathing there and do shift E and it
+
+21
+00:01:41,720 --> 00:01:45,120
+trims that wall to that sheathing.
+
+22
+00:01:45,760 --> 00:01:51,920
+There's actually a little glitch right now where it trims it to the top of that sheathing
+
+23
+00:01:51,920 --> 00:01:54,120
+and not to the bottom.
+
+24
+00:01:54,120 --> 00:01:56,720
+I think that glitch will be fixed soon enough.
+
+25
+00:01:56,720 --> 00:02:03,640
+But the nice thing again with doing that shift extend now it's intelligently connected so
+
+26
+00:02:03,640 --> 00:02:12,480
+you can move this wall up and do shift G on that and it regenerates that wall.
+
+27
+00:02:12,480 --> 00:02:16,720
+Move it down to zero.
+
+28
+00:02:16,720 --> 00:02:19,120
+Do shift G and it trims that wall.
+
diff --git a/083000_20250307_1451 - Creating linked aggregates for the floor assembly/083000_20250307_1451 - Creating linked aggregates for the floor assembly.srt b/083000_20250307_1451 - Creating linked aggregates for the floor assembly/083000_20250307_1451 - Creating linked aggregates for the floor assembly.srt
new file mode 100644
index 0000000..0d435cf
--- /dev/null
+++ b/083000_20250307_1451 - Creating linked aggregates for the floor assembly/083000_20250307_1451 - Creating linked aggregates for the floor assembly.srt
@@ -0,0 +1,128 @@
+1
+00:00:00,000 --> 00:00:05,000
+So for this project I'd like to panelize the walls and floors as much as possible.
+
+2
+00:00:05,000 --> 00:00:11,000
+So that means building them in the factory and ultimately craning them into place.
+
+3
+00:00:11,000 --> 00:00:18,000
+And so for this first floor, I'd like to create a floor assembly about this large here.
+
+4
+00:00:18,000 --> 00:00:25,000
+And repeat that floor assembly exactly here and then two of them here and here.
+
+5
+00:00:25,000 --> 00:00:28,000
+So we'll use linked aggregates to do that.
+
+6
+00:00:28,000 --> 00:00:36,000
+Linked aggregates, as you remember from previous videos, if you have multiple instances of that linked aggregate in space,
+
+7
+00:00:36,000 --> 00:00:40,000
+if you update one, all of them will update in space.
+
+8
+00:00:40,000 --> 00:00:45,000
+So let's first create an aggregate of this area here.
+
+9
+00:00:45,000 --> 00:00:50,000
+So if you remember, this was an array that we composed.
+
+10
+00:00:50,000 --> 00:00:56,000
+Unfortunately at this time we can't have arrays inside the aggregate, so we've got to break the array.
+
+11
+00:00:56,000 --> 00:01:07,000
+So to do that, select any number in the array and go here, select all the objects in the array, and then we're going to apply the array.
+
+12
+00:01:07,000 --> 00:01:10,000
+So now it's no longer an array.
+
+13
+00:01:10,000 --> 00:01:22,000
+So before we convert it to an aggregate, let's place our cursor somewhere where we want the origin basically of the aggregate.
+
+14
+00:01:22,000 --> 00:01:25,000
+So let's say we'll put it there.
+
+15
+00:01:25,000 --> 00:01:36,000
+So from here, we'll go click add, name it floor assembly.
+
+16
+00:01:36,000 --> 00:01:42,000
+Okay, and you can turn on and off this decorator to see the extent of that aggregate.
+
+17
+00:01:42,000 --> 00:01:52,000
+So now that it's an aggregate, you can pick any one of those objects in there and click this duplicate.
+
+18
+00:01:52,000 --> 00:02:02,000
+And hopefully it created a linked aggregate here.
+
+19
+00:02:02,000 --> 00:02:04,000
+There we go.
+
+20
+00:02:04,000 --> 00:02:11,000
+So, let's see here.
+
+21
+00:02:11,000 --> 00:02:16,000
+Okay, yep, we have two aggregates that are attached.
+
+22
+00:02:16,000 --> 00:02:25,000
+So I'm going to actually copy this linked aggregate around the rest of the model here and I'll get back to you.
+
+23
+00:02:25,000 --> 00:02:33,000
+So I copied that aggregate that we made throughout the project. You can see here, those are all linked aggregates.
+
+24
+00:02:33,000 --> 00:02:36,000
+So I added the sheathing here.
+
+25
+00:02:36,000 --> 00:02:39,000
+Let's add that sheathing now to this aggregate.
+
+26
+00:02:39,000 --> 00:02:47,000
+So to do that, click on the sheathing and we want to use the part.
+
+27
+00:02:47,000 --> 00:02:53,000
+So pick up the part of the aggregate there and I'll assign it.
+
+28
+00:02:53,000 --> 00:02:56,000
+So now that sheathing is part of that linked aggregate.
+
+29
+00:02:56,000 --> 00:03:07,000
+So let's now refresh that and hopefully all the other aggregates in the world will be refreshed now with that sheathing.
+
+30
+00:03:07,000 --> 00:03:09,000
+So there you go.
+
+31
+00:03:09,000 --> 00:03:12,000
+Now we can delete this one that's off to the side.
+
+32
+00:03:12,000 --> 00:03:19,000
+Select that and all its parts and then just simply delete it.
+
diff --git a/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement.srt b/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement.srt
new file mode 100644
index 0000000..79dcd7e
--- /dev/null
+++ b/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement.srt
@@ -0,0 +1,132 @@
+1
+00:00:00,000 --> 00:00:06,480
+So when I was off camera I further refined these aggregates here. All four
+
+2
+00:00:06,480 --> 00:00:11,200
+of these are linked aggregates that are all the same. I also made this into an
+
+3
+00:00:11,200 --> 00:00:17,560
+aggregate too. I don't believe it's a LinkedIn or linked aggregate. And then
+
+4
+00:00:17,560 --> 00:00:23,120
+these two walls I moved out six inches further just for the design I just needed
+
+5
+00:00:23,120 --> 00:00:29,520
+a little more room. So often when you're using other BIM software you
+
+6
+00:00:29,520 --> 00:00:37,160
+create section reference planes and construction lines to help you model. For
+
+7
+00:00:37,160 --> 00:00:43,280
+example you could do a reference line down the middle of a building and it
+
+8
+00:00:43,280 --> 00:00:49,680
+allows you to mirror certain things inside of the other. So to do that in
+
+9
+00:00:49,680 --> 00:00:57,400
+Bonsai we use a class called IFC Virtual Element. And before we do that let's just
+
+10
+00:00:57,600 --> 00:01:08,480
+add in a simple mesh and turn it 90 degrees here. And I'm going to locate the
+
+11
+00:01:08,480 --> 00:01:20,920
+origin set origin to 3d cursor and I'm going to view it locally. So Bonsai uses
+
+12
+00:01:20,920 --> 00:01:28,920
+the local axis to mirror certain things. So right now the z-axis needs to be
+
+13
+00:01:28,920 --> 00:01:37,160
+along the edge of that plane and then the Y needs to be vertical. So we have to
+
+14
+00:01:37,160 --> 00:01:44,840
+switch that. We click on this to affect only origins and I'm going to turn this
+
+15
+00:01:44,840 --> 00:01:58,440
+90 and then I need to turn the Y up. Y up 90. Okay now we can create an IFC
+
+16
+00:01:58,440 --> 00:02:08,320
+Virtual Element. Assign and we are going to give it an object type.
+
+17
+00:02:08,320 --> 00:02:17,400
+We're going to say reference plan. All the reference planes in plan will be
+
+18
+00:02:17,400 --> 00:02:21,440
+called reference plan and then we'll do some in section that will be called
+
+19
+00:02:21,440 --> 00:02:27,959
+reference section. That way we can turn them on and off easy in our drawings for
+
+20
+00:02:27,960 --> 00:02:39,920
+example. You can also name it say midpoint building. Save and then I'm just
+
+21
+00:02:39,920 --> 00:02:42,960
+going to tab into it.
+
+22
+00:02:48,000 --> 00:02:54,920
+And I'm just gonna stretch things out.
+
+23
+00:02:57,960 --> 00:03:24,680
+All right let's see if it works for mirroring things. So if I take this wall
+
+24
+00:03:24,680 --> 00:03:28,640
+actually let's do this one. Let's take this one and we're gonna mirror it about
+
+25
+00:03:28,640 --> 00:03:42,480
+that. See what happens. Oh there we go. See so I'm gonna save this IFC file and
+
+26
+00:03:42,480 --> 00:03:51,840
+then I'm gonna open it again. Zoom in turn our materials on. So you can see our
+
+27
+00:03:51,840 --> 00:03:59,880
+reference plane went transparent and the way to do that is in preferences if
+
+28
+00:03:59,880 --> 00:04:02,480
+you're curious.
+
+29
+00:04:04,560 --> 00:04:17,160
+Sorry going the wrong one. Bonsai. And I believe it's under drawings and it says
+
+30
+00:04:17,160 --> 00:04:23,480
+classes to wireframe. So you can actually add more to this if you want. You can say
+
+31
+00:04:23,480 --> 00:04:29,600
+IFC space if you wanted to. So when you open a file it actually converts
+
+32
+00:04:29,600 --> 00:04:34,720
+those objects to wireframe which is kind of nice. So that's where that settings
+
+33
+00:04:34,720 --> 00:04:37,680
+at if you need to know.
+
diff --git a/085000_20250310_1723 - Introduction to Drawings/085000_20250310_1723 - Introduction to Drawings.srt b/085000_20250310_1723 - Introduction to Drawings/085000_20250310_1723 - Introduction to Drawings.srt
new file mode 100644
index 0000000..b9ea82d
--- /dev/null
+++ b/085000_20250310_1723 - Introduction to Drawings/085000_20250310_1723 - Introduction to Drawings.srt
@@ -0,0 +1,204 @@
+1
+00:00:00,000 --> 00:00:03,920
+So off-camera I added these other reference planes here
+
+2
+00:00:05,280 --> 00:00:07,560
+view it in 2d
+
+3
+00:00:09,060 --> 00:00:12,560
+Kind of rename them more logically too you can see
+
+4
+00:00:16,460 --> 00:00:19,880
+So we finally come to it let's make some drawings
+
+5
+00:00:20,760 --> 00:00:23,400
+This is the most fun part about bonsai
+
+6
+00:00:24,560 --> 00:00:28,600
+so to start drawings click on this tab here and
+
+7
+00:00:30,320 --> 00:00:33,140
+We're just gonna create a floor plan for now
+
+8
+00:00:33,520 --> 00:00:41,160
+You can put this pull down menu tells you which type of drawing you can make and then where you're taking the drawing
+
+9
+00:00:41,540 --> 00:00:46,720
+So before we do that, I'm going to just put my 3d cursor somewhere
+
+10
+00:00:47,240 --> 00:00:48,320
+around
+
+11
+00:00:48,320 --> 00:00:50,320
+the floor plan there and
+
+12
+00:00:51,000 --> 00:00:53,519
+I'm gonna go to first floor and
+
+13
+00:00:54,200 --> 00:00:58,440
+click add and then it adds it under here the plan view and
+
+14
+00:00:59,280 --> 00:01:02,280
+Select it and then activate it here
+
+15
+00:01:03,839 --> 00:01:12,400
+And so bonsai bonsai drawings essentially use blenders cameras, so if you're familiar with
+
+16
+00:01:14,360 --> 00:01:19,460
+Blenders cameras it's the same thing you can you know click G to move around
+
+17
+00:01:21,440 --> 00:01:27,320
+So a few things that are different however is if you want to change the boundary
+
+18
+00:01:28,600 --> 00:01:30,600
+Of those drawings you do it here
+
+19
+00:01:34,920 --> 00:01:36,920
+I'm in
+
+20
+00:01:37,600 --> 00:01:42,880
+G again move it around you can set the scale here
+
+21
+00:01:46,880 --> 00:01:53,000
+And then the depth is pretty obvious increase the depth you can see further into the drawing
+
+22
+00:01:53,000 --> 00:01:59,440
+Okay, let's run the drawing click on this icon here to run the drawing
+
+23
+00:02:02,080 --> 00:02:05,740
+And you can see down here that one drawing was created in the background there
+
+24
+00:02:05,740 --> 00:02:08,960
+and so in order to view it you do this eyeball here and
+
+25
+00:02:09,639 --> 00:02:13,320
+It should open the your default browser
+
+26
+00:02:14,040 --> 00:02:16,140
+This is an SVG drawing here
+
+27
+00:02:16,140 --> 00:02:28,100
+If you both want to run the drawing and have it pop up in your browser you hit ctrl and then this icon here
+
+28
+00:02:28,619 --> 00:02:31,619
+And it should open it up automatically
+
+29
+00:02:34,459 --> 00:02:36,500
+Down here under element filters
+
+30
+00:02:36,500 --> 00:02:42,980
+This is where you can tell it what elements you want in your drawing or not in your drawing
+
+31
+00:02:43,500 --> 00:02:45,500
+so in the
+
+32
+00:02:45,540 --> 00:02:47,540
+Include one
+
+33
+00:02:48,700 --> 00:02:50,100
+You can
+
+34
+00:02:50,100 --> 00:02:56,340
+Add a filter or it's under class now, so we can say show me only
+
+35
+00:02:57,460 --> 00:02:59,460
+IFC walls
+
+36
+00:03:00,020 --> 00:03:03,940
+Say save and now when you run your drawing
+
+37
+00:03:04,860 --> 00:03:06,860
+I'll do ctrl click on that
+
+38
+00:03:07,580 --> 00:03:09,580
+It will only show walls
+
+39
+00:03:12,900 --> 00:03:14,900
+So we can remove that
+
+40
+00:03:16,500 --> 00:03:18,500
+I see you're just gonna remove these
+
+41
+00:03:26,740 --> 00:03:30,900
+Okay, and then for the no exclude filter that means
+
+42
+00:03:32,660 --> 00:03:37,220
+Everything you list is actually excluded from the drawing so for this one
+
+43
+00:03:37,380 --> 00:03:42,280
+Let's add a search group class add filter and now we want to do IFC
+
+44
+00:03:43,220 --> 00:03:45,220
+virtual element
+
+45
+00:03:45,500 --> 00:03:50,860
+Those are the virtual or construction reference plans that we've made previously so we say save
+
+46
+00:03:51,700 --> 00:03:53,700
+And now those get turned off
+
+47
+00:03:54,580 --> 00:03:59,840
+So if you want to save these settings you can do that
+
+48
+00:04:03,420 --> 00:04:05,420
+And say
+
+49
+00:04:07,380 --> 00:04:12,220
+Plan okay and save
+
+50
+00:04:15,900 --> 00:04:18,540
+So if you remove these I
+
+51
+00:04:21,800 --> 00:04:28,400
+Believe you can pull the plan back again plan there we go it's back
+
diff --git a/086000_20250310_1813 - Continue covering drawings/086000_20250310_1813 - Continue covering drawings.srt b/086000_20250310_1813 - Continue covering drawings/086000_20250310_1813 - Continue covering drawings.srt
new file mode 100644
index 0000000..40473e9
--- /dev/null
+++ b/086000_20250310_1813 - Continue covering drawings/086000_20250310_1813 - Continue covering drawings.srt
@@ -0,0 +1,292 @@
+1
+00:00:00,000 --> 00:00:04,000
+Let's go back to our drawing that we made last session.
+
+2
+00:00:04,000 --> 00:00:08,000
+If you click on this underlay here,
+
+3
+00:00:08,000 --> 00:00:12,000
+it will actually render out a rendered drawing.
+
+4
+00:00:12,000 --> 00:00:16,000
+We can test that out. Click on that.
+
+5
+00:00:20,000 --> 00:00:24,000
+It's the rendered view.
+
+6
+00:00:24,000 --> 00:00:28,000
+To change the drawing style,
+
+7
+00:00:28,000 --> 00:00:32,000
+Blender or Bonsai comes with three shading styles.
+
+8
+00:00:32,000 --> 00:00:36,000
+Currently the Blender default one
+
+9
+00:00:36,000 --> 00:00:40,000
+is activated on this drawing.
+
+10
+00:00:40,000 --> 00:00:44,000
+To see the different ones, let's activate the drawing style.
+
+11
+00:00:44,000 --> 00:00:48,000
+I like to go to this mode to see
+
+12
+00:00:48,000 --> 00:00:52,000
+more accurately what it's going to look like.
+
+13
+00:00:52,000 --> 00:00:56,000
+Then we can run the drawing again.
+
+14
+00:00:56,000 --> 00:01:00,000
+We'll go to the graphical shading style.
+
+15
+00:01:00,000 --> 00:01:04,000
+Activate that drawing.
+
+16
+00:01:04,000 --> 00:01:08,000
+Then back to Blender default.
+
+17
+00:01:12,000 --> 00:01:16,000
+So you can
+
+18
+00:01:16,000 --> 00:01:20,000
+from here tweak the rendering settings.
+
+19
+00:01:20,000 --> 00:01:24,000
+If you're familiar with Blender's
+
+20
+00:01:24,000 --> 00:01:28,000
+all the various millions of rendering settings you can
+
+21
+00:01:28,000 --> 00:01:32,000
+tweak, you can
+
+22
+00:01:32,000 --> 00:01:36,000
+say for example, go up here and switch
+
+23
+00:01:36,000 --> 00:01:40,000
+the rendering engine to Eevee instead of Cycles.
+
+24
+00:01:40,000 --> 00:01:44,000
+And then you can go here and
+
+25
+00:01:44,000 --> 00:01:48,000
+say turn off Scene World, Scene Lights.
+
+26
+00:01:48,000 --> 00:01:52,000
+And go back to the drawing panel here.
+
+27
+00:01:52,000 --> 00:01:56,000
+So after making these changes then
+
+28
+00:01:56,000 --> 00:02:00,000
+you can save it back into the drawing style.
+
+29
+00:02:00,000 --> 00:02:04,000
+So select the drawing style and then say save drawing style.
+
+30
+00:02:08,000 --> 00:02:12,000
+So we then can
+
+31
+00:02:12,000 --> 00:02:16,000
+save the IC file.
+
+32
+00:02:16,000 --> 00:02:20,000
+And then open it again. See if those settings have
+
+33
+00:02:20,000 --> 00:02:24,000
+been saved.
+
+34
+00:02:28,000 --> 00:02:32,000
+Alright, cool. They've been saved.
+
+35
+00:02:32,000 --> 00:02:36,000
+So some other settings
+
+36
+00:02:36,000 --> 00:02:40,000
+you might want to save into your shading style.
+
+37
+00:02:40,000 --> 00:02:44,000
+I like to turn extras off in relationship lines.
+
+38
+00:02:44,000 --> 00:02:48,000
+Those are Blender things that typically you don't want
+
+39
+00:02:48,000 --> 00:02:52,000
+in your drawings. And then I mess around with this setting
+
+40
+00:02:52,000 --> 00:02:56,000
+every so often.
+
+41
+00:02:56,000 --> 00:03:00,000
+I usually just keep it off. So after
+
+42
+00:03:00,000 --> 00:03:04,000
+clicking those off then again you have to go back to
+
+43
+00:03:04,000 --> 00:03:08,000
+your active shading style and say
+
+44
+00:03:08,000 --> 00:03:12,000
+save drawing style.
+
+45
+00:03:12,000 --> 00:03:16,000
+Then you can increase the DPI of the output.
+
+46
+00:03:18,000 --> 00:03:22,000
+Takes a little longer to run obviously.
+
+47
+00:03:22,000 --> 00:03:26,000
+But it might be worth it.
+
+48
+00:03:36,000 --> 00:03:40,000
+I won't get into these settings quite yet. The
+
+49
+00:03:40,000 --> 00:03:44,000
+Fill Mode actually doesn't even work at this point.
+
+50
+00:03:44,000 --> 00:03:48,000
+I'll just cover these later. Usually just keep them at default settings.
+
+51
+00:03:48,000 --> 00:03:52,000
+So you can duplicate a drawing too.
+
+52
+00:03:52,000 --> 00:03:56,000
+So let's click on that.
+
+53
+00:03:56,000 --> 00:04:00,000
+If we had annotations you would click that but we don't have any annotations yet.
+
+54
+00:04:00,000 --> 00:04:04,000
+So we can rename it
+
+55
+00:04:04,000 --> 00:04:08,000
+Basement. Then activate it.
+
+56
+00:04:08,000 --> 00:04:12,000
+And
+
+57
+00:04:12,000 --> 00:04:16,000
+we can move this down.
+
+58
+00:04:20,000 --> 00:04:24,000
+1, negative 5.
+
+59
+00:04:24,000 --> 00:04:28,000
+Quick run this drawing.
+
+60
+00:04:38,000 --> 00:04:42,000
+So if you remember under
+
+61
+00:04:42,000 --> 00:04:46,000
+Element Filters we've excluded the IFC Virtual Element.
+
+62
+00:04:46,000 --> 00:04:50,000
+But if you click this icon here it basically turns
+
+63
+00:04:50,000 --> 00:04:54,000
+on everything. All the objects in the model.
+
+64
+00:04:54,000 --> 00:04:58,000
+So that comes in handy sometimes.
+
+65
+00:04:58,000 --> 00:05:02,000
+In general if you ever wonder what an icon does usually
+
+66
+00:05:02,000 --> 00:05:06,000
+you can just hover over it for a couple seconds. So for example
+
+67
+00:05:06,000 --> 00:05:10,000
+this one here if you hold shift and click on that button there
+
+68
+00:05:10,000 --> 00:05:14,000
+it runs all of the drawings that are in
+
+69
+00:05:14,000 --> 00:05:18,000
+the list and that are checked here you can see. If you want to
+
+70
+00:05:18,000 --> 00:05:22,000
+unselect all those you do a shift click
+
+71
+00:05:22,000 --> 00:05:26,000
+of that or click it to select them all.
+
+72
+00:05:26,000 --> 00:05:30,000
+Again you can shift click this and it should run
+
+73
+00:05:30,000 --> 00:05:34,000
+both of these drawings in the background.
+
diff --git a/087000_20250311_1227 - Adding section and modifying section & level annotation/087000_20250311_1227 - Adding section and modifying section & level annotation.srt b/087000_20250311_1227 - Adding section and modifying section & level annotation/087000_20250311_1227 - Adding section and modifying section & level annotation.srt
new file mode 100644
index 0000000..65e6059
--- /dev/null
+++ b/087000_20250311_1227 - Adding section and modifying section & level annotation/087000_20250311_1227 - Adding section and modifying section & level annotation.srt
@@ -0,0 +1,276 @@
+1
+00:00:00,000 --> 00:00:06,540
+So let's select a couple of these reference plans here and then go to our floor plan.
+
+2
+00:00:07,900 --> 00:00:08,620
+Activate it.
+
+3
+00:00:10,780 --> 00:00:14,220
+You'll see that the two things that I selected are still in that view,
+
+4
+00:00:15,260 --> 00:00:18,620
+although IFC virtual elements should be turned off.
+
+5
+00:00:18,620 --> 00:00:20,700
+The only reason is because they're selected.
+
+6
+00:00:21,260 --> 00:00:25,820
+So if you want to deselect them and then run it again, they should disappear there.
+
+7
+00:00:25,820 --> 00:00:29,580
+So let's create a couple sections then.
+
+8
+00:00:29,580 --> 00:00:37,520
+I'm going to put my 3D cursor there and do a, I'll do an E section.
+
+9
+00:00:37,520 --> 00:00:39,460
+Okay.
+
+10
+00:00:39,460 --> 00:00:43,680
+And you can see it puts in a section annotation line there.
+
+11
+00:00:43,680 --> 00:00:45,620
+Again, the direction that it's going.
+
+12
+00:00:45,620 --> 00:00:48,860
+Let's open that section.
+
+13
+00:00:48,860 --> 00:00:51,060
+Activate it.
+
+14
+00:00:52,060 --> 00:00:58,460
+So it again, like the plan, you can adjust the width and the height there.
+
+15
+00:01:02,460 --> 00:01:03,460
+Move around.
+
+16
+00:01:05,460 --> 00:01:08,260
+See our reference planes are there.
+
+17
+00:01:08,260 --> 00:01:13,160
+So we can use the same filter, save filter that we did last time.
+
+18
+00:01:13,160 --> 00:01:17,420
+Even though it's called plan, still work for us.
+
+19
+00:01:18,420 --> 00:01:20,620
+Plan, save.
+
+20
+00:01:21,620 --> 00:01:22,320
+Cool.
+
+21
+00:01:22,320 --> 00:01:24,120
+Turn off the reference planes there.
+
+22
+00:01:24,120 --> 00:01:27,120
+I'll readjust this a little bit more.
+
+23
+00:01:33,220 --> 00:01:41,960
+So you notice now that our level annotations here are outside the bounds of the drawing.
+
+24
+00:01:41,960 --> 00:01:45,900
+So in order to change that, you select it.
+
+25
+00:01:46,400 --> 00:01:50,200
+And I'm going to do period over here so you can tell what I'm selecting.
+
+26
+00:01:50,200 --> 00:01:50,700
+Okay.
+
+27
+00:01:50,700 --> 00:01:53,200
+Selecting the first floor.
+
+28
+00:01:53,200 --> 00:01:56,000
+So there's a little glitch on how to change these.
+
+29
+00:01:56,000 --> 00:02:03,300
+If you tab into it, you'll see down here that it doesn't allow you to tab anymore.
+
+30
+00:02:03,300 --> 00:02:07,300
+So if you ever see that, tab out of it again.
+
+31
+00:02:07,300 --> 00:02:10,400
+And then go up here, do edit mode.
+
+32
+00:02:10,400 --> 00:02:13,500
+This is just a quirky little glitch right now.
+
+33
+00:02:13,500 --> 00:02:19,300
+And then change the location of those elevation lines.
+
+34
+00:02:21,300 --> 00:02:23,800
+And then tab out of it again.
+
+35
+00:02:23,800 --> 00:02:31,000
+And then now, once you've changed it one time, for whatever reason, if you tab into it again,
+
+36
+00:02:31,000 --> 00:02:33,100
+it works now.
+
+37
+00:02:33,100 --> 00:02:39,900
+So I'm not quite sure why that is, but just know that is the situation.
+
+38
+00:02:44,500 --> 00:02:45,500
+Yep.
+
+39
+00:02:50,300 --> 00:02:55,900
+So if you say later on you change this bounds here,
+
+40
+00:02:55,900 --> 00:03:03,100
+another way instead of modifying the actual vertices of the line,
+
+41
+00:03:03,100 --> 00:03:08,100
+you can delete these and then run the drawing again.
+
+42
+00:03:09,100 --> 00:03:14,700
+And they kind of reestablish themselves relative to the new boundary.
+
+43
+00:03:14,700 --> 00:03:18,700
+So that's one quick way of readjusting those.
+
+44
+00:03:20,700 --> 00:03:24,700
+So let's create another section out there.
+
+45
+00:03:24,700 --> 00:03:26,700
+We'll do a north section.
+
+46
+00:03:26,700 --> 00:03:28,700
+Add it.
+
+47
+00:03:29,299 --> 00:03:31,299
+And...
+
+48
+00:03:33,299 --> 00:03:40,299
+Okay, and again, use our save filter.
+
+49
+00:03:42,299 --> 00:03:47,299
+And again, just boundaries as you need them.
+
+50
+00:03:51,299 --> 00:03:53,299
+And the scale.
+
+51
+00:03:53,900 --> 00:03:59,900
+When you change the scale, you can really tell because the annotation changes relative to that.
+
+52
+00:03:59,900 --> 00:04:04,900
+Before, without an annotation, it was hard to tell what changed.
+
+53
+00:04:12,900 --> 00:04:16,900
+So let's go back to the east section here.
+
+54
+00:04:16,900 --> 00:04:21,900
+So you can tell where that section, that north section is being applied there.
+
+55
+00:04:22,500 --> 00:04:29,500
+So if you go to the north section here, select the boundaries,
+
+56
+00:04:29,500 --> 00:04:35,500
+and change, that should change the Y dimension slightly,
+
+57
+00:04:35,500 --> 00:04:38,500
+and then go back to east section.
+
+58
+00:04:38,500 --> 00:04:40,500
+Oh, it did update.
+
+59
+00:04:40,500 --> 00:04:46,500
+Usually sometimes the section line doesn't update when you do that.
+
+60
+00:04:46,500 --> 00:04:49,500
+It was in the old position.
+
+61
+00:04:50,100 --> 00:04:55,100
+If that ever happens, you can again delete the section,
+
+62
+00:04:55,100 --> 00:04:59,100
+run it, and it should relocate the section again,
+
+63
+00:04:59,100 --> 00:05:01,100
+or section annotation.
+
+64
+00:05:01,100 --> 00:05:04,100
+And again, similar to the elevation lines,
+
+65
+00:05:04,100 --> 00:05:07,100
+you can select the section annotation.
+
+66
+00:05:07,100 --> 00:05:11,100
+See, there's a bug with tabbing into it the first time.
+
+67
+00:05:11,100 --> 00:05:15,100
+If that happens, go to that edit mode.
+
+68
+00:05:16,100 --> 00:05:18,100
+And then change these.
+
+69
+00:05:19,500 --> 00:05:25,100
+Tab out of it.
+
diff --git a/088000_20250311_1441 - Tweaking drawing styles/088000_20250311_1441 - Tweaking drawing styles.srt b/088000_20250311_1441 - Tweaking drawing styles/088000_20250311_1441 - Tweaking drawing styles.srt
new file mode 100644
index 0000000..8ebce2d
--- /dev/null
+++ b/088000_20250311_1441 - Tweaking drawing styles/088000_20250311_1441 - Tweaking drawing styles.srt
@@ -0,0 +1,76 @@
+1
+00:00:00,000 --> 00:00:06,160
+camera I created all these new sections here throughout the project and then I
+
+2
+00:00:06,720 --> 00:00:13,120
+modeled in the garage slab which is the same I've see slab type as the basement slab
+
+3
+00:00:14,480 --> 00:00:19,520
+you can hear that see the sections I created let me just open a couple just to check it out
+
+4
+00:00:19,520 --> 00:00:30,000
+so let's run this drawing here this first floor plan
+
+5
+00:00:34,480 --> 00:00:42,560
+so you can see that the background grid shows up let's figure out a way to turn that off and then
+
+6
+00:00:42,560 --> 00:00:52,000
+also have the background color be white so let's go back to the drawing here so to turn the grid off
+
+7
+00:00:55,120 --> 00:00:57,440
+we do this here turn those off as well
+
+8
+00:01:00,160 --> 00:01:07,360
+and for a background clear background or white background just say
+
+9
+00:01:08,320 --> 00:01:11,840
+you go to film here and click on transparent
+
+10
+00:01:14,320 --> 00:01:25,039
+and let me switch this to scene lights and scene world and I like modifying this parameter here
+
+11
+00:01:27,520 --> 00:01:34,320
+I actually increase the exposure in the gamma so my floor plans
+
+12
+00:01:34,720 --> 00:01:41,520
+don't render the colors don't render out so richly so you can massage these parameters as you wish
+
+13
+00:01:42,720 --> 00:01:50,160
+so I'm just gonna go with that and then lastly I'm going to turn on wireframe here
+
+14
+00:01:51,919 --> 00:01:58,160
+and yeah I'm going to slide this all the way to the left okay let's run the drawing see what
+
+15
+00:01:58,160 --> 00:02:02,240
+how it looks control click on that
+
+16
+00:02:06,160 --> 00:02:11,359
+all right that looks a lot better so if those are the settings that we like
+
+17
+00:02:11,359 --> 00:02:19,280
+again you have to make sure to save them into your styles or drawing styles so again we're
+
+18
+00:02:19,280 --> 00:02:25,680
+under blender default which is this one and then we want to save drawing styles if you don't do
+
+19
+00:02:25,680 --> 00:02:38,000
+this and you open the ifc file new it won't all these settings will be lost so save drawing style
+
diff --git a/089000_20250311_1540 - Orthographic & Perspective drawings/089000_20250311_1540 - Orthographic & Perspective drawings.srt b/089000_20250311_1540 - Orthographic & Perspective drawings/089000_20250311_1540 - Orthographic & Perspective drawings.srt
new file mode 100644
index 0000000..431c9f2
--- /dev/null
+++ b/089000_20250311_1540 - Orthographic & Perspective drawings/089000_20250311_1540 - Orthographic & Perspective drawings.srt
@@ -0,0 +1,436 @@
+1
+00:00:00,000 --> 00:00:04,360
+So creating elevations is similar to creating sections.
+
+2
+00:00:04,360 --> 00:00:07,000
+Locate your 3D cursor.
+
+3
+00:00:07,000 --> 00:00:09,840
+Go to elevation.
+
+4
+00:00:09,840 --> 00:00:11,520
+Click on East.
+
+5
+00:00:11,520 --> 00:00:15,280
+See down here.
+
+6
+00:00:15,280 --> 00:00:18,080
+Click on South.
+
+7
+00:00:21,640 --> 00:00:24,600
+West.
+
+8
+00:00:24,600 --> 00:00:29,840
+And North.
+
+9
+00:00:29,840 --> 00:00:32,439
+We'll just open one.
+
+10
+00:00:32,439 --> 00:00:33,200
+Quick to see.
+
+11
+00:00:35,960 --> 00:00:37,960
+And similar idea.
+
+12
+00:00:37,960 --> 00:00:40,320
+Just adjust these.
+
+13
+00:00:40,320 --> 00:00:43,920
+I won't go into that too far.
+
+14
+00:00:43,920 --> 00:00:46,800
+Let's create a perspective then.
+
+15
+00:00:46,800 --> 00:00:48,040
+I'm going to go to floor plan.
+
+16
+00:00:50,680 --> 00:00:53,220
+Click anywhere we 3D cursor.
+
+17
+00:00:53,220 --> 00:00:55,440
+And we're going to go to model.
+
+18
+00:00:55,480 --> 00:01:00,080
+Let's go to, let's go orthogonal first.
+
+19
+00:01:00,080 --> 00:01:02,640
+So plus.
+
+20
+00:01:02,640 --> 00:01:05,640
+And then open it and activate it.
+
+21
+00:01:05,640 --> 00:01:11,960
+And what I like to do is do shift tilde.
+
+22
+00:01:11,960 --> 00:01:18,039
+And that way the camera is locked into place
+
+23
+00:01:18,039 --> 00:01:19,800
+relative to your view.
+
+24
+00:01:19,800 --> 00:01:23,320
+If you didn't do shift tilde and you kind of just rotated it,
+
+25
+00:01:23,360 --> 00:01:25,759
+it'll move it out of the camera.
+
+26
+00:01:25,759 --> 00:01:30,199
+So numpad zero to go back and then shift tilde.
+
+27
+00:01:30,199 --> 00:01:32,440
+And you can move this around.
+
+28
+00:01:32,440 --> 00:01:34,160
+Zoom it in.
+
+29
+00:01:34,160 --> 00:01:38,600
+Actually in orthogonal you can zoom in.
+
+30
+00:01:38,600 --> 00:01:41,039
+And then increase the depth here.
+
+31
+00:01:41,039 --> 00:01:47,000
+4,000.
+
+32
+00:01:47,000 --> 00:01:47,479
+Similar.
+
+33
+00:01:47,479 --> 00:01:48,880
+Just adjust these as you need to.
+
+34
+00:01:53,320 --> 00:02:00,839
+And again, element filters exclude.
+
+35
+00:02:00,839 --> 00:02:02,800
+The plan again.
+
+36
+00:02:02,800 --> 00:02:05,199
+And save.
+
+37
+00:02:05,199 --> 00:02:08,600
+There we go.
+
+38
+00:02:08,600 --> 00:02:13,079
+All right, let's do a perspective then.
+
+39
+00:02:13,079 --> 00:02:14,160
+Perspective.
+
+40
+00:02:14,160 --> 00:02:15,680
+Click on that.
+
+41
+00:02:15,680 --> 00:02:16,560
+Activate it.
+
+42
+00:02:19,799 --> 00:02:21,320
+I'm going to turn on the entire model
+
+43
+00:02:21,359 --> 00:02:24,480
+just so I can see what's going on here.
+
+44
+00:02:24,480 --> 00:02:25,359
+Shift tilde.
+
+45
+00:02:25,359 --> 00:02:26,239
+OK, there we go.
+
+46
+00:02:26,239 --> 00:02:28,359
+Zoom it out.
+
+47
+00:02:28,359 --> 00:02:33,760
+Increase the depth to like 4,000.
+
+48
+00:02:33,760 --> 00:02:34,799
+Shift tilde again.
+
+49
+00:02:45,120 --> 00:02:46,359
+Adjust these as you need.
+
+50
+00:02:46,360 --> 00:02:54,120
+There's also one other setting that comes in handy.
+
+51
+00:02:54,120 --> 00:03:01,160
+Click on the perspective.
+
+52
+00:03:01,160 --> 00:03:04,120
+I'm going to turn that on.
+
+53
+00:03:04,120 --> 00:03:06,520
+And go to camera here.
+
+54
+00:03:06,520 --> 00:03:09,760
+And you can adjust the focal length.
+
+55
+00:03:09,760 --> 00:03:14,720
+That setting should probably be here.
+
+56
+00:03:14,760 --> 00:03:16,359
+But it's not at this point.
+
+57
+00:03:19,200 --> 00:03:20,760
+Zoom in.
+
+58
+00:03:20,760 --> 00:03:26,640
+And again, exclude plan.
+
+59
+00:03:26,640 --> 00:03:29,280
+And save.
+
+60
+00:03:29,280 --> 00:03:31,200
+And activate it again.
+
+61
+00:03:31,200 --> 00:03:34,280
+OK, there's the rest of the objects.
+
+62
+00:03:34,280 --> 00:03:42,600
+So if you run the drawing, you'll notice that it's empty.
+
+63
+00:03:42,640 --> 00:03:45,960
+If you're in perspective, it doesn't do a line drawing.
+
+64
+00:03:45,960 --> 00:03:47,880
+You have to just do underlay.
+
+65
+00:03:47,880 --> 00:03:50,760
+So for all perspectives, you got to do underlay.
+
+66
+00:03:54,480 --> 00:03:56,880
+For some reason, that wig dial.
+
+67
+00:03:56,880 --> 00:04:02,359
+Let's try to save this and open it again.
+
+68
+00:04:02,359 --> 00:04:04,000
+I think there's a glitch.
+
+69
+00:04:04,000 --> 00:04:06,079
+OK, I think I know what happened.
+
+70
+00:04:06,079 --> 00:04:09,720
+There's a weird glitch with perspectives currently.
+
+71
+00:04:12,799 --> 00:04:14,920
+For some reason, the width and the height
+
+72
+00:04:14,920 --> 00:04:16,279
+are connected to the depth.
+
+73
+00:04:16,279 --> 00:04:19,040
+And they shouldn't be, but they are.
+
+74
+00:04:19,040 --> 00:04:26,400
+So if I change that to 200 and activate it,
+
+75
+00:04:26,400 --> 00:04:28,880
+those numbers reset themselves.
+
+76
+00:04:28,880 --> 00:04:35,240
+What was happening, if you went to 4,000 and activate,
+
+77
+00:04:35,240 --> 00:04:39,920
+the air came from, it was essentially
+
+78
+00:04:39,920 --> 00:04:45,080
+trying to create a rendering with a humongous DPI there.
+
+79
+00:04:45,080 --> 00:04:47,640
+So that's why it choked on us.
+
+80
+00:04:47,640 --> 00:04:52,240
+So if we bring this down, it's something more sane.
+
+81
+00:04:52,240 --> 00:04:53,680
+Let's see if the output there.
+
+82
+00:04:53,680 --> 00:04:55,720
+That's a little more sane.
+
+83
+00:04:55,720 --> 00:04:58,680
+And then try to run it.
+
+84
+00:04:58,680 --> 00:05:01,360
+See what happens.
+
+85
+00:05:01,360 --> 00:05:03,640
+There we go.
+
+86
+00:05:03,640 --> 00:05:05,560
+So one thing you'll notice with this rendering,
+
+87
+00:05:05,560 --> 00:05:07,520
+those floor joists are telegraphing
+
+88
+00:05:07,520 --> 00:05:09,240
+through the sheathing.
+
+89
+00:05:09,280 --> 00:05:12,120
+That's something we probably don't want.
+
+90
+00:05:12,120 --> 00:05:14,720
+So there's a couple of things you could do.
+
+91
+00:05:14,720 --> 00:05:18,080
+First one is we select the camera
+
+92
+00:05:18,080 --> 00:05:21,840
+and go here and increase this value, this clip start.
+
+93
+00:05:21,840 --> 00:05:24,440
+You see it going back and forth?
+
+94
+00:05:24,440 --> 00:05:29,960
+Increase it, it makes those lines go away to a degree.
+
+95
+00:05:29,960 --> 00:05:36,040
+So if I go back to drawing and run it,
+
+96
+00:05:36,040 --> 00:05:39,120
+it improves it a little bit, but not 100%.
+
+97
+00:05:39,160 --> 00:05:44,040
+So the other thing I like to do is create a new drawing
+
+98
+00:05:44,040 --> 00:05:47,560
+style for renderings.
+
+99
+00:05:47,560 --> 00:05:51,680
+So I'm going to click New.
+
+100
+00:05:51,680 --> 00:05:55,240
+I'm going to say Rendering.
+
+101
+00:05:55,240 --> 00:05:57,240
+And I'm going to activate the drawing.
+
+102
+00:06:00,200 --> 00:06:06,320
+Then I am going to go up here and turn our wireframe off.
+
+103
+00:06:06,360 --> 00:06:10,719
+And I'm going to save drawing style again.
+
+104
+00:06:10,719 --> 00:06:12,240
+Go up here.
+
+105
+00:06:12,240 --> 00:06:15,760
+Let's run it again and see what happens.
+
+106
+00:06:15,760 --> 00:06:17,719
+So that's a little better.
+
+107
+00:06:17,719 --> 00:06:21,840
+So these are the settings that you'll get a feel for
+
+108
+00:06:21,840 --> 00:06:24,080
+and what you can tweak and what's
+
+109
+00:06:24,080 --> 00:06:26,920
+acceptable for your drawing style.
+
diff --git a/089000_20250311_1540 - Orthographic & Perspective drawings/20250311_1631.srt b/089000_20250311_1540 - Orthographic & Perspective drawings/20250311_1631.srt
new file mode 100644
index 0000000..4f677e8
--- /dev/null
+++ b/089000_20250311_1540 - Orthographic & Perspective drawings/20250311_1631.srt
@@ -0,0 +1,48 @@
+1
+00:00:00,000 --> 00:00:04,320
+So one thing you'll notice with this rendering those floor joists are telegraphing through the
+
+2
+00:00:04,320 --> 00:00:11,040
+sheathing. That's something we probably don't want. So there's a couple things you could do.
+
+3
+00:00:11,040 --> 00:00:17,440
+First one is you select the camera and go here and increase this value, this clip start.
+
+4
+00:00:18,240 --> 00:00:25,280
+You see it going back and forth? Increase it, it makes those lines go away to a degree.
+
+5
+00:00:26,240 --> 00:00:28,880
+So if I go back to drawing and run it,
+
+6
+00:00:32,400 --> 00:00:39,280
+it improves it a little bit but not 100%. So the other thing I like to do is create a new
+
+7
+00:00:39,920 --> 00:00:49,920
+drawing style for renderings. So I'm going to click new. I'm going to say rendering.
+
+8
+00:00:49,920 --> 00:00:53,600
+And I'm going to activate the drawing.
+
+9
+00:00:56,640 --> 00:01:00,480
+Then I'm going to go up here and turn our wireframe off.
+
+10
+00:01:02,880 --> 00:01:10,160
+And I'm going to save drawing style again. Go up here. Let's run it again and see what happens.
+
+11
+00:01:12,080 --> 00:01:16,560
+So that's a little better. So these are the settings that you'll get to
+
+12
+00:01:16,560 --> 00:01:23,920
+get a feel for and what you can tweak and what's acceptable for your drawing style.
+
diff --git a/090000_20250311_1700 - Creating sheets and placing drawings/090000_20250311_1700 - Creating sheets and placing drawings.srt b/090000_20250311_1700 - Creating sheets and placing drawings/090000_20250311_1700 - Creating sheets and placing drawings.srt
new file mode 100644
index 0000000..8135804
--- /dev/null
+++ b/090000_20250311_1700 - Creating sheets and placing drawings/090000_20250311_1700 - Creating sheets and placing drawings.srt
@@ -0,0 +1,112 @@
+1
+00:00:00,000 --> 00:00:06,080
+Alright let's create our first sheet. You do that here. You can see the various
+
+2
+00:00:06,080 --> 00:00:13,480
+sheet sizes there. We'll just start with A1. Click on plus. Then down here
+
+3
+00:00:13,480 --> 00:00:17,720
+highlight the drawing you want to put in the sheet and then click on this icon
+
+4
+00:00:17,720 --> 00:00:24,500
+here. You can see it adds it to that sheet there. And then similar to running
+
+5
+00:00:24,500 --> 00:00:32,259
+drawings you do click control on that icon and it runs the actual drawing.
+
+6
+00:00:32,259 --> 00:00:38,720
+There you can see there's a default sheet title that ultimately you can
+
+7
+00:00:38,720 --> 00:00:47,700
+change. We'll cover that later on. You can add different drawings then. Shift click
+
+8
+00:00:47,900 --> 00:00:56,900
+run that. Okay so now let's say we want to move this section up to that corner.
+
+9
+00:00:56,900 --> 00:01:06,820
+We can do that but if we click on this icon to open sheet layout it'll just
+
+10
+00:01:06,820 --> 00:01:12,900
+open Chrome which ultimately we can't use Chrome to move stuff around. So we
+
+11
+00:01:12,900 --> 00:01:19,740
+have to tell Bonsai to use a different application. And so let me get the path
+
+12
+00:01:19,740 --> 00:01:28,740
+here. Where you designate that is in preferences and add-ons. Go to command
+
+13
+00:01:28,740 --> 00:01:36,020
+and then this layout SVG command. Then paste in. This is essentially you have to
+
+14
+00:01:36,020 --> 00:01:41,740
+find the application that you want to use. In this instance I'm using Inkscape
+
+15
+00:01:41,780 --> 00:01:46,619
+and that's the path that I'm using. So you can just copy everything else and
+
+16
+00:01:46,619 --> 00:01:55,339
+then close and hopefully when we click on this it'll open Inkscape now.
+
+17
+00:01:57,619 --> 00:02:04,539
+Okay so from inside Inkscape then you can click on the actual drawing and
+
+18
+00:02:04,580 --> 00:02:12,140
+relocate it to out where you want it. And then you can actually click again. I'm
+
+19
+00:02:12,140 --> 00:02:17,460
+actually gonna move this over. You can kind of double click in the drawing
+
+20
+00:02:17,460 --> 00:02:27,020
+until you get that drawing name or drawing title and move that and then
+
+21
+00:02:27,020 --> 00:02:32,340
+move the whole thing back. And similar you can move this around it as you'd
+
+22
+00:02:32,340 --> 00:02:40,260
+like. Sometimes you accidentally move this background here and if you do you
+
+23
+00:02:40,260 --> 00:02:46,780
+can lock it so it doesn't do that anymore. So you rearrange your sheet with
+
+24
+00:02:46,780 --> 00:02:56,140
+your drawings how you like them and then save the drawing. And go back to Bonsai
+
+25
+00:02:56,260 --> 00:03:03,100
+and then if you run the sheet the location should be updated.
+
+26
+00:03:10,339 --> 00:03:18,540
+So you can change these the numbers you know per the drawing. You do that here
+
+27
+00:03:19,060 --> 00:03:27,660
+could be you know whatever 33 or 12.
+
+28
+00:03:35,260 --> 00:03:38,980
+See it updated there.
+
diff --git a/091000_20250312_1331 - Adding dimensions/091000_20250312_1331 - Adding dimensions.srt b/091000_20250312_1331 - Adding dimensions/091000_20250312_1331 - Adding dimensions.srt
new file mode 100644
index 0000000..3c9a46e
--- /dev/null
+++ b/091000_20250312_1331 - Adding dimensions/091000_20250312_1331 - Adding dimensions.srt
@@ -0,0 +1,140 @@
+1
+00:00:00,000 --> 00:00:06,360
+So off camera I created these additional sheets here and then I added the
+
+2
+00:00:06,360 --> 00:00:11,280
+corresponding drawing to these sheets. Just to give you a sense I'll open a
+
+3
+00:00:11,280 --> 00:00:18,960
+couple. So just place the drawing on the sheet there you see.
+
+4
+00:00:18,960 --> 00:00:32,240
+So let's start annotating this floor plan we have here. So go to this
+
+5
+00:00:32,240 --> 00:00:38,320
+annotation tool like we did a long time ago on a previous videos and change this
+
+6
+00:00:38,320 --> 00:00:49,600
+to dimension and put your 3d cursor somewhere and say add. Alright I'm going
+
+7
+00:00:49,600 --> 00:00:54,080
+to tab out of it and I'm just going to rotate it.
+
+8
+00:00:54,080 --> 00:01:04,000
+Minus tab into it again and locate it there.
+
+9
+00:01:04,400 --> 00:01:12,200
+Okay there tab out of it. Okay there's one and then once you have one dimension in
+
+10
+00:01:12,200 --> 00:01:16,120
+there I like to just duplicate it.
+
+11
+00:01:22,320 --> 00:01:34,560
+Tab into it and you can do running dimensions. Just select the line or all
+
+12
+00:01:34,560 --> 00:01:44,560
+the vertices then go subdivide and then you can take incremental measurements.
+
+13
+00:01:44,560 --> 00:01:47,560
+Subdivide.
+
+14
+00:01:53,640 --> 00:02:02,680
+Or if you're at the end here vertex you can type E for extrude lock the Y and
+
+15
+00:02:02,680 --> 00:02:11,920
+tab out. There's running dimensions there. So you notice how the tolerance
+
+16
+00:02:11,920 --> 00:02:23,600
+here is very high. You can massage that within you know half an inch or quarter
+
+17
+00:02:23,600 --> 00:02:32,520
+inch if you'd like. So that is done in the properties that are linked to the
+
+18
+00:02:32,560 --> 00:02:38,200
+actual drawing. So select the boundary of the drawing or the camera rather and
+
+19
+00:02:38,200 --> 00:02:45,000
+then go to object information and then here's a bunch of parameters associated
+
+20
+00:02:45,000 --> 00:02:50,040
+with the drawing. So I want to edit there and the parameter that we want to change
+
+21
+00:02:50,040 --> 00:02:55,960
+is this one. So let's say we want to get a tolerance close to a quarter inch there.
+
+22
+00:02:55,960 --> 00:03:06,240
+Say okay and then you can see it modifies the dimension line. A few other
+
+23
+00:03:06,240 --> 00:03:12,560
+things you can do with the dimensions. Select the dimension and add a BIM
+
+24
+00:03:12,560 --> 00:03:21,840
+dimension type there. A property rather. You can add prefixes and suffix so
+
+25
+00:03:21,840 --> 00:03:30,320
+before and just try this as it before the dimension and then suffix would be
+
+26
+00:03:30,320 --> 00:03:38,160
+added afterwards. You can turn off the dimension altogether and then have it
+
+27
+00:03:38,160 --> 00:03:47,480
+take on the description instead. Hello and just show that I think you're gonna
+
+28
+00:03:47,480 --> 00:03:56,920
+have the description and yes the dimension show as well.
+
+29
+00:03:56,920 --> 00:04:02,440
+Unfortunately this custom unit doesn't work quite yet. It's hot off the press
+
+30
+00:04:02,440 --> 00:04:10,519
+but yes you can ultimately the objective is to change the dimension type or unit
+
+31
+00:04:10,520 --> 00:04:17,360
+type. You can suppress zero inches so if you had something that was zero feet
+
+32
+00:04:17,360 --> 00:04:24,120
+seven inches it would only show seven inches so that's kind of nice. Another
+
+33
+00:04:24,120 --> 00:04:27,640
+nice feature to know about is that you can change the color of these
+
+34
+00:04:27,640 --> 00:04:32,720
+annotations on the screen. Right now they're white so you can go up to
+
+35
+00:04:32,720 --> 00:04:42,760
+preferences add-ons colors and change the color.
+
diff --git a/092000_20250312_1454 - Intelligent tags/092000_20250312_1454 - Intelligent tags.srt b/092000_20250312_1454 - Intelligent tags/092000_20250312_1454 - Intelligent tags.srt
new file mode 100644
index 0000000..78eccad
--- /dev/null
+++ b/092000_20250312_1454 - Intelligent tags/092000_20250312_1454 - Intelligent tags.srt
@@ -0,0 +1,180 @@
+1
+00:00:00,000 --> 00:00:06,320
+So let's make an intelligent tag that pulls out information from an object into an annotation tag.
+
+2
+00:00:07,040 --> 00:00:11,920
+So to do that we're in the annotation mode here. I'm going to switch this down to leader
+
+3
+00:00:12,880 --> 00:00:20,240
+and put the 3d cursor somewhere and say add and I'm going to subdivide it.
+
+4
+00:00:21,200 --> 00:00:25,680
+I'm going to tab out of it okay to see the direction of things
+
+5
+00:00:25,680 --> 00:00:29,840
+and I'm just going to move these over here
+
+6
+00:00:34,480 --> 00:00:36,880
+move this up and a little bit over
+
+7
+00:00:39,280 --> 00:00:46,239
+and let's say I'm pointing at the wall. So right now this is just a dumb
+
+8
+00:00:46,239 --> 00:00:52,480
+intelligent or dumb annotation tag and we can change the text here if we want.
+
+9
+00:00:52,480 --> 00:01:04,239
+You know whatever we want to say okay you can notice how it's super long.
+
+10
+00:01:04,239 --> 00:01:11,039
+You can actually change that with adding new lines at certain intervals as you can see there
+
+11
+00:01:13,840 --> 00:01:20,640
+and then you can also change where the leader attaches itself to the text there.
+
+12
+00:01:22,960 --> 00:01:26,560
+You can also change the font size.
+
+13
+00:01:29,120 --> 00:01:36,240
+Okay so we can also make it intelligent as well so it actually pulls out information from that
+
+14
+00:01:36,240 --> 00:01:47,120
+wall so let's do that. Let's first just pull out the wall's name so you for these intelligent
+
+15
+00:01:48,000 --> 00:01:54,960
+tags you use these curly brackets so let's just start with name to start things out.
+
+16
+00:01:56,960 --> 00:02:02,960
+So right now it doesn't do anything it actually pulls out the name of the annotation tag but we
+
+17
+00:02:02,960 --> 00:02:08,960
+don't want that we want to pull the name out of the wall so click on the wall and the tag
+
+18
+00:02:09,760 --> 00:02:20,400
+and go down here and set this use the eyedropper to pick up the wall and say okay. So right now
+
+19
+00:02:20,400 --> 00:02:31,440
+it's pulling out the name of the wall which is just wall but we can change that to the wall say
+
+20
+00:02:31,520 --> 00:02:37,600
+okay and so similar kind of concept if we want to
+
+21
+00:02:40,079 --> 00:02:51,280
+pull out the description this is the description say okay we can change this to I believe
+
+22
+00:02:52,160 --> 00:02:53,840
+the description
+
+23
+00:02:56,800 --> 00:03:04,240
+and it pulls that out so you're probably wondering where do I how do you know what to put in there
+
+24
+00:03:04,240 --> 00:03:12,960
+to pull out the appropriate information well there's documentation this path or url
+
+25
+00:03:14,000 --> 00:03:18,000
+you should probably save in your favorites because you're going to go back to it a lot
+
+26
+00:03:18,800 --> 00:03:26,160
+um it's basically selector syntax it shows you what you can put in those fields to pull out
+
+27
+00:03:26,160 --> 00:03:35,600
+the information that you need this is kind of on the official documentation and then this here is
+
+28
+00:03:35,600 --> 00:03:43,360
+where that is hosted on github and this I like to use this better because it updates more frequently
+
+29
+00:03:44,080 --> 00:03:51,280
+they're both the same but some has more current information so the area we want to go down is
+
+30
+00:03:51,280 --> 00:03:57,680
+this area getting element values so while right already we've used name
+
+31
+00:04:00,560 --> 00:04:08,400
+we can use let's do type name just to see what happens back click on this
+
+32
+00:04:08,400 --> 00:04:16,880
+and instead of description we want to use type name okay so he pulls out the type name
+
+33
+00:04:17,920 --> 00:04:33,440
+let's try some other ones um let's do this p wall status
+
+34
+00:04:33,760 --> 00:04:42,880
+okay it doesn't say it doesn't say anything yet because we didn't assign a status to the wall yet
+
+35
+00:04:42,880 --> 00:04:52,000
+so let's do that more common add and it's existing let's say so there goes pulls out the existing
+
+36
+00:04:52,000 --> 00:05:04,640
+um this is nice because you can use this to uh no matter what the class is so i'm gonna change this
+
+37
+00:05:11,520 --> 00:05:17,520
+does the same thing i'm going to duplicate this and i'm going to attach that
+
+38
+00:05:17,840 --> 00:05:29,200
+to the drain tile and say okay it says none because we haven't set the uh status yet so let
+
+39
+00:05:29,200 --> 00:05:42,799
+me do that common and say that's new okay there you go and finally this one's a good one that i
+
+40
+00:05:42,800 --> 00:05:47,760
+finally this one's a good one that i use a lot this gets the name of the material in the first
+
+41
+00:05:47,760 --> 00:05:54,720
+item in a material set so if you have a wall that's made of many layers you can tell it what
+
+42
+00:05:55,600 --> 00:06:04,080
+layer um to what material name to get out of what layer so let's try that
+
+43
+00:06:12,800 --> 00:06:19,840
+okay all right so yeah that's our concrete wall with two inches of rigid insulation so it's
+
+44
+00:06:19,840 --> 00:06:25,680
+pulling out that first layer which is the rigid insulation so if we wanted to tell it
+
+45
+00:06:25,680 --> 00:06:32,080
+let's pull up the second layer essentially say that there you go
+
diff --git a/093000_20250312_1635 - Annotation tag types/093000_20250312_1635 - Annotation tag types.srt b/093000_20250312_1635 - Annotation tag types/093000_20250312_1635 - Annotation tag types.srt
new file mode 100644
index 0000000..993cf44
--- /dev/null
+++ b/093000_20250312_1635 - Annotation tag types/093000_20250312_1635 - Annotation tag types.srt
@@ -0,0 +1,176 @@
+1
+00:00:00,000 --> 00:00:06,480
+So let's explore annotation tag types. So that's under this annotation tool and up here.
+
+2
+00:00:07,200 --> 00:00:13,600
+Let's start with material tags first. So select those objects that you'd like to apply the tag to.
+
+3
+00:00:13,600 --> 00:00:18,400
+I'm going to select these three things, the drain tile, the wall, and then the stair.
+
+4
+00:00:19,200 --> 00:00:23,920
+And then I'm going to click on bulk tag and then it applies those tags.
+
+5
+00:00:24,720 --> 00:00:29,280
+So I'm going to click turn on extras so I can select these tags.
+
+6
+00:00:30,720 --> 00:00:38,720
+So if you select that tag and go to object information, you can see the intelligent
+
+7
+00:00:39,600 --> 00:00:48,960
+syntax that it's using. It's material.name. And material.name changes
+
+8
+00:00:49,760 --> 00:00:58,480
+is based on what type of object it is. So in this situation the material is applied
+
+9
+00:01:00,240 --> 00:01:05,920
+through IFC material. That's basically one material per object type of thing.
+
+10
+00:01:06,880 --> 00:01:13,040
+This the wall here, its material makeup is IFC material layer set.
+
+11
+00:01:13,440 --> 00:01:22,000
+And that's basically a way to define layers. So we click on this drain tile,
+
+12
+00:01:22,880 --> 00:01:28,560
+it's using an IFC material profile set. So this tag,
+
+13
+00:01:30,960 --> 00:01:38,240
+if we wanted to pull out information from a wall for example, we'd have to change
+
+14
+00:01:38,240 --> 00:01:50,960
+the layer set name. So this is the layer set name of the wall.
+
+15
+00:01:54,960 --> 00:02:04,800
+That changes. So for the drain tile, kind of similar concept. This is the
+
+16
+00:02:05,360 --> 00:02:08,960
+name of the profile set.
+
+17
+00:02:13,040 --> 00:02:19,359
+That changed it there. So again going back to our documentation here,
+
+18
+00:02:20,079 --> 00:02:26,000
+I've actually just recently updated this. So here we're using the material name and if it's
+
+19
+00:02:26,640 --> 00:02:32,880
+we're using IFC material it's that basically it's easy it's the assigned material. If we're using a
+
+20
+00:02:32,880 --> 00:02:39,040
+layer set like walls and slabs it's going to be the name of the layer set. And then if we're going
+
+21
+00:02:39,040 --> 00:02:46,160
+to do a material profile set that's used in beams and that drain tile it's the name of the overall
+
+22
+00:02:46,160 --> 00:02:53,280
+material set. And then I won't get into constituent sets yet. But if we go to this level here now,
+
+23
+00:02:54,320 --> 00:03:01,359
+if we're using IFC material it doesn't apply. If we're using a layer set it's the name of
+
+24
+00:03:01,360 --> 00:03:07,120
+the first material. And then if we're using profile sets the name of the first material profile.
+
+25
+00:03:08,000 --> 00:03:14,960
+And then if we go even further down if we're using IFC material it's just the same as the
+
+26
+00:03:15,760 --> 00:03:22,800
+this one up here. And then if we're using a layer set it's the material name of the first material
+
+27
+00:03:22,800 --> 00:03:29,520
+layer. And then profile set the material name of the first material profile. Yes all this is
+
+28
+00:03:29,520 --> 00:03:40,240
+confusing but you'll get used to it after a while. So let's actually change our tag to take
+
+29
+00:03:40,240 --> 00:03:47,760
+on this information instead. So I'm going to click on that and now since this is the type
+
+30
+00:03:49,840 --> 00:03:56,000
+if I just change the type here it should all change. So it says none
+
+31
+00:03:56,640 --> 00:04:04,000
+so that's okay because that was IFC material. So here we have to add additional information. So
+
+32
+00:04:06,480 --> 00:04:14,320
+on the wall we're going to change this is the first layer they save.
+
+33
+00:04:14,720 --> 00:04:27,280
+And then second layer save. So we're pulling out the second layer then here we'll do similar.
+
+34
+00:04:28,159 --> 00:04:35,359
+And that's here profile name
+
+35
+00:04:37,520 --> 00:04:38,080
+they save.
+
+36
+00:04:40,559 --> 00:04:45,760
+That pulls that so again we can go even further down now we want to pull out the material
+
+37
+00:04:46,400 --> 00:04:50,239
+name that tag.
+
+38
+00:04:57,599 --> 00:05:04,640
+Okay so there we didn't have to change anything now because the material name
+
+39
+00:05:05,359 --> 00:05:12,000
+material was already signed to that to those profiles and layer sets.
+
+40
+00:05:13,359 --> 00:05:19,520
+Then if we change this type again and change this to a one so we're picking up the second
+
+41
+00:05:20,400 --> 00:05:29,520
+layer essentially it changes. So that wall has two layers but this profile only has one profile
+
+42
+00:05:29,520 --> 00:05:36,320
+the profile set only has one profile so it's not pulling out anything. So yes this is all confusing
+
+43
+00:05:36,320 --> 00:05:44,320
+again but hopefully that illustration or demonstration gives you an understanding of the
+
+44
+00:05:44,320 --> 00:05:49,120
+understanding of the madness behind it all.
+
diff --git a/094000_20250313_1220 - going through the various asset folders/094000_20250313_1220 - going through the various asset folders.srt b/094000_20250313_1220 - going through the various asset folders/094000_20250313_1220 - going through the various asset folders.srt
new file mode 100644
index 0000000..8ea189a
--- /dev/null
+++ b/094000_20250313_1220 - going through the various asset folders/094000_20250313_1220 - going through the various asset folders.srt
@@ -0,0 +1,304 @@
+1
+00:00:00,000 --> 00:00:08,000
+So in our project folder where our IFC file is, you probably noticed when we created our drawings and sheets
+
+2
+00:00:09,000 --> 00:00:15,000
+that it created these three folders here. Sheets, layouts, and drawings.
+
+3
+00:00:16,000 --> 00:00:21,000
+I just want to go through them so you get a sense of what's inside each one.
+
+4
+00:00:22,000 --> 00:00:26,000
+So sheets, as you would imagine, you're going to have your sheets here.
+
+5
+00:00:26,000 --> 00:00:36,000
+The SVGs contain the line work for both the title sheet and also the various drawings.
+
+6
+00:00:37,000 --> 00:00:45,000
+Then the underlays are the shaded part of the drawing that corresponds to the line work here.
+
+7
+00:00:46,000 --> 00:00:48,000
+So pretty self-explanatory.
+
+8
+00:00:48,000 --> 00:01:01,000
+Layouts, this is where in Bonsai when you open up the layout in Inkscape to modify the location of the drawings on the sheet,
+
+9
+00:01:02,000 --> 00:01:05,000
+these are the files you're essentially opening.
+
+10
+00:01:05,000 --> 00:01:15,000
+Title blocks, here you can see that's just the default title block that came with Bonsai.
+
+11
+00:01:16,000 --> 00:01:24,000
+Then assets here, only one asset is for the layouts, that's just the drawing title.
+
+12
+00:01:25,000 --> 00:01:29,000
+You can see that's where the drawing name and the scale go.
+
+13
+00:01:29,000 --> 00:01:33,000
+And then finally drawings.
+
+14
+00:01:34,000 --> 00:01:44,000
+So again, similar to sheets, you're going to have SVG drawings that are the line work and then the raster underlay that goes with that line work.
+
+15
+00:01:45,000 --> 00:01:52,000
+Cache you can ignore. Sometimes you have to, if there's an error or whatever with running the drawing,
+
+16
+00:01:52,000 --> 00:02:01,000
+you might want to delete the corresponding files in there to rerun the drawing again, but usually you don't have to modify with cache.
+
+17
+00:02:02,000 --> 00:02:06,000
+And so assets, this is the folder that you're going to use a lot.
+
+18
+00:02:07,000 --> 00:02:13,000
+There's five files, default, markers, patterns, shading style, symbols.
+
+19
+00:02:13,000 --> 00:02:25,000
+So default CSS is where you're going to change those rules to tell your line work what kind of color they want to be,
+
+20
+00:02:26,000 --> 00:02:32,000
+what kind of dash pattern it wants to be, or what fill pattern you want.
+
+21
+00:02:33,000 --> 00:02:35,000
+We can go into that detail here.
+
+22
+00:02:35,000 --> 00:02:44,000
+Markers, that is where you'll have dimension tick marks or your grid markers.
+
+23
+00:02:45,000 --> 00:02:47,000
+What are some other things?
+
+24
+00:02:48,000 --> 00:02:53,000
+You know, diameter marker, stair marker, plan level marker.
+
+25
+00:02:54,000 --> 00:02:58,000
+So you can modify the geometry of those things in that file.
+
+26
+00:02:58,000 --> 00:03:09,000
+Patterns, as you imagine, like a concrete pattern or sand pattern or a wood pattern, you can apply those to our drawings.
+
+27
+00:03:10,000 --> 00:03:14,000
+And that's how you set, how you change those and also how you add more to that.
+
+28
+00:03:15,000 --> 00:03:19,000
+Shading styles, if you remember, that's where we save our drawing styles.
+
+29
+00:03:20,000 --> 00:03:29,000
+So in the last couple videos, we created a new rendering drawing style and that's where that goes, saves it in there.
+
+30
+00:03:30,000 --> 00:03:32,000
+And then finally, symbols.
+
+31
+00:03:33,000 --> 00:03:41,000
+Symbols are going to be like a window tag or a space tag or an elevation tag, those various things.
+
+32
+00:03:41,000 --> 00:03:50,000
+So don't get scared. I opened these five files I just talked about in a text editor.
+
+33
+00:03:51,000 --> 00:03:59,000
+This text editor is just called VS Code, but there's thousands, it seems, of text readers and editors you can use.
+
+34
+00:04:00,000 --> 00:04:07,000
+So this default CSS, you'll probably be in this file the most changing things.
+
+35
+00:04:08,000 --> 00:04:24,000
+As I mentioned before, this is where you can designate what color your lines are, whether they're dashed lines, how thick they are, the fills of various outlines.
+
+36
+00:04:25,000 --> 00:04:30,000
+So, for example, you can change your text. You can change that to red if you'd like.
+
+37
+00:04:30,000 --> 00:04:35,000
+Your cut pattern, change that to a different color.
+
+38
+00:04:36,000 --> 00:04:44,000
+So all these various things, I won't stay on a high level on that. We'll go into more detail or examples later.
+
+39
+00:04:45,000 --> 00:04:55,000
+So markers here, again, like I told you, you can adjust your level marker, section marker in dimension end or start.
+
+40
+00:04:56,000 --> 00:05:04,000
+Don't worry, you don't necessarily have to open this file to change these things. You can use Inkscape and I'll show you how to do that.
+
+41
+00:05:05,000 --> 00:05:10,000
+Similar to patterns, let's see here, scroll up here.
+
+42
+00:05:11,000 --> 00:05:20,000
+Again, with patterns file, you really have to open the text file to change it. You can use Inkscape, but this just gives you a sense of what's in there.
+
+43
+00:05:20,000 --> 00:05:29,000
+You know, diagonal patterns, board patterns, cross hatch, earth pattern, glass, liquid.
+
+44
+00:05:30,000 --> 00:05:37,000
+So on and on. Sand, wood. You can see sand has a lot of dots and lines in it.
+
+45
+00:05:38,000 --> 00:05:45,000
+And I think there's, you know, concrete as well. So again, don't worry about editing that file in a text editor.
+
+46
+00:05:45,000 --> 00:05:51,000
+Shading styles rarely ever do here. I don't usually have to touch this at all.
+
+47
+00:05:52,000 --> 00:05:55,000
+Again, this is just where our drawing styles are saved.
+
+48
+00:05:56,000 --> 00:06:02,000
+And finally, symbols. Again, you can use Inkscape to change this stuff, but just to give you a sense of what's in here.
+
+49
+00:06:03,000 --> 00:06:07,000
+You know, circle tag, door tag, window tag, space tag, etc., etc.
+
+50
+00:06:07,000 --> 00:06:15,000
+So I opened some of these files then in Inkscape here. The markers file, patterns file, and the symbols file.
+
+51
+00:06:16,000 --> 00:06:18,000
+So I'll go to markers first.
+
+52
+00:06:19,000 --> 00:06:28,000
+So when you open markers, the way that SVG file is formatted is that you won't see the geometry right away.
+
+53
+00:06:29,000 --> 00:06:33,000
+You have to open this layers and objects tab here.
+
+54
+00:06:33,000 --> 00:06:40,000
+It's under here. To see kind of the breakdown of what's in that file.
+
+55
+00:06:41,000 --> 00:06:54,000
+And so if you ultimately want to modify that geometry in there, you have to click and drag it towards the end and pull it out of its little folder essentially.
+
+56
+00:06:55,000 --> 00:06:58,000
+And so from here, you can do the modifications.
+
+57
+00:06:58,000 --> 00:07:03,000
+You know, let's say it's a little more oblong like that.
+
+58
+00:07:04,000 --> 00:07:11,000
+Once you're done, you drag it back in to the folder it came from.
+
+59
+00:07:12,000 --> 00:07:14,000
+And then obviously save.
+
+60
+00:07:19,000 --> 00:07:23,000
+And this all assumes you know how to use Inkscape. I'm not going to go into detail for that.
+
+61
+00:07:23,000 --> 00:07:36,000
+So patterns are again unique in that you don't see any of the folders or the geometry.
+
+62
+00:07:37,000 --> 00:07:42,000
+But you can. You have to open up another window to see that.
+
+63
+00:07:43,000 --> 00:07:46,000
+It's the XML editor essentially.
+
+64
+00:07:46,000 --> 00:07:53,000
+And it works kind of like the layers and objects, but just it gets another view basically of the structure.
+
+65
+00:07:54,000 --> 00:08:02,000
+So in here again, you can see crosshatch, earth patterns, sand, concrete.
+
+66
+00:08:03,000 --> 00:08:07,000
+So similarly, if you say you want to change the wood pattern.
+
+67
+00:08:08,000 --> 00:08:12,000
+You open it, click on that path and drag it to the bottom.
+
+68
+00:08:13,000 --> 00:08:14,000
+And you should be able to tell.
+
+69
+00:08:14,000 --> 00:08:19,000
+So now you can change color, put more geometry in there, whatever.
+
+70
+00:08:20,000 --> 00:08:23,000
+And when you're done, you drag it back into the wood pattern there.
+
+71
+00:08:24,000 --> 00:08:28,000
+And yes, symbols.
+
+72
+00:08:29,000 --> 00:08:30,000
+Symbols. Okay.
+
+73
+00:08:31,000 --> 00:08:36,000
+Luckily, symbols, yes, you'll be able to see the geometry right away in the layers and objects here.
+
+74
+00:08:37,000 --> 00:08:39,000
+You turn them all off.
+
+75
+00:08:40,000 --> 00:08:48,000
+You know, section tag, space tag, window tag.
+
+76
+00:08:49,000 --> 00:08:58,000
+So again, you can change the geometry, save it, and then they'll ultimately show up in your drawings when you run them.
+
diff --git a/095000_20250313_1301 - Changing the default.css/095000_20250313_1301 - Changing the default.css.srt b/095000_20250313_1301 - Changing the default.css/095000_20250313_1301 - Changing the default.css.srt
new file mode 100644
index 0000000..5ef5312
--- /dev/null
+++ b/095000_20250313_1301 - Changing the default.css/095000_20250313_1301 - Changing the default.css.srt
@@ -0,0 +1,136 @@
+1
+00:00:00,000 --> 00:00:05,160
+So let's try to change some of these assets and see how they affect our
+
+2
+00:00:05,160 --> 00:00:12,840
+drawing. So before I change anything I'm just gonna run a drawing to see what it
+
+3
+00:00:12,840 --> 00:00:16,520
+looks like without changing anything.
+
+4
+00:00:16,520 --> 00:00:35,560
+Okay, alright. So let us go to the default CSS here. So let's just for fun change
+
+5
+00:00:35,560 --> 00:00:42,720
+that to red and save it. Then go back to your Blender file. So here's a little
+
+6
+00:00:42,760 --> 00:00:52,120
+trick. If you've run the drawing and your background shading doesn't change you
+
+7
+00:00:52,120 --> 00:00:56,760
+can click on this and so it'll use the cache settings so it won't run the
+
+8
+00:00:56,760 --> 00:01:03,420
+rendering which takes a long time or longer when you run your drawings. So
+
+9
+00:01:03,420 --> 00:01:11,400
+with a cache enabled and you hit run your drawing it should go faster. So here
+
+10
+00:01:11,400 --> 00:01:17,920
+you can see what that rule that we changed what it affects the actual text
+
+11
+00:01:17,920 --> 00:01:23,000
+in the file. You can see it's red. So let's change a couple of other things.
+
+12
+00:01:23,000 --> 00:01:36,920
+Let's do a cut pattern. Let's do a fill. I don't know a yellow fill and let's do a
+
+13
+00:01:37,080 --> 00:01:55,200
+magenta stroke. So save. Run the drawing again and beautiful. Yes. Keep going here.
+
+14
+00:01:55,200 --> 00:02:10,520
+Annotation. Let's try that. Let's try blue maybe. Save. Like here. Run the drawing.
+
+15
+00:02:12,880 --> 00:02:22,400
+There you go. You can see there's only a few things that get changed there. Let us...
+
+16
+00:02:22,400 --> 00:02:28,720
+Oh I have CNT. That's probably what we wanted. So I'm going to change that to I
+
+17
+00:02:28,720 --> 00:02:42,680
+don't know that kind of color. Save. Run the drawing. There we go. So that leader
+
+18
+00:02:42,680 --> 00:02:50,440
+line work changed the color and the grid lines. So a little trick if you're using
+
+19
+00:02:50,600 --> 00:02:57,760
+Google Chrome or a lot of these browsers do this. If you zoom into some geometry
+
+20
+00:02:57,760 --> 00:03:04,840
+and the right-click on it and say inspect you can actually see those rules
+
+21
+00:03:04,840 --> 00:03:14,160
+that apply to that geometry and you can actually change it here if you want to.
+
+22
+00:03:14,200 --> 00:03:21,840
+So you could change the color here. It doesn't save it back into the CSS file
+
+23
+00:03:21,840 --> 00:03:28,560
+so you would have to just copy it here and then go back and paste in that
+
+24
+00:03:28,560 --> 00:03:34,400
+information into the file here. But it's kind of a nice way to work out the
+
+25
+00:03:34,400 --> 00:03:42,800
+colors and line thicknesses that you're looking to achieve. Also too you
+
+26
+00:03:42,800 --> 00:03:49,840
+can tell what rule is applied to that. You know obviously this IFC annotation
+
+27
+00:03:49,840 --> 00:03:56,720
+class rule is applied to that but also there's this rule that's affecting the
+
+28
+00:03:56,720 --> 00:04:04,000
+dashed line. So you can just change it here if you want just to see how it's
+
+29
+00:04:04,000 --> 00:04:12,000
+affected. And then if you like that ultimately you can copy. Then we got to
+
+30
+00:04:12,000 --> 00:04:17,839
+find that rule back in our file.
+
+31
+00:04:19,200 --> 00:04:27,760
+Oh there we go. So yeah you can reapply it here. Make sure you get your curly
+
+32
+00:04:27,760 --> 00:04:30,520
+brackets in there.
+
+33
+00:04:30,520 --> 00:04:47,039
+And save. And if we go back to the drawing again those styles for
+
+34
+00:04:47,039 --> 00:04:50,039
+that line have changed.
+
diff --git a/096000_20250313_1420 - Default_css and adding new css classes via Metadata property/096000_20250313_1420 - Default_css and adding new css classes via Metadata property.srt b/096000_20250313_1420 - Default_css and adding new css classes via Metadata property/096000_20250313_1420 - Default_css and adding new css classes via Metadata property.srt
new file mode 100644
index 0000000..70345fe
--- /dev/null
+++ b/096000_20250313_1420 - Default_css and adding new css classes via Metadata property/096000_20250313_1420 - Default_css and adding new css classes via Metadata property.srt
@@ -0,0 +1,236 @@
+1
+00:00:00,000 --> 00:00:08,460
+So if we run the drawing and open it in Chrome and right-click on one of these
+
+2
+00:00:08,460 --> 00:00:16,900
+walls here you'll see over here that it highlights basically the geometry of
+
+3
+00:00:16,900 --> 00:00:24,900
+that wall the lines that compose it and if you go up one level higher essentially
+
+4
+00:00:24,900 --> 00:00:29,420
+the group I think that's what G stands for you can see that there are four
+
+5
+00:00:29,440 --> 00:00:37,000
+classes attached to that group so this being one of them is the second one
+
+6
+00:00:37,000 --> 00:00:45,400
+third one and this is the fourth class as you can see we have a CSS rule
+
+7
+00:00:45,400 --> 00:00:51,240
+applied to that cut class but we don't have a CS rule for IFC wall or this one
+
+8
+00:00:51,240 --> 00:00:57,140
+here we could though however if you want to create a new one then we can just
+
+9
+00:00:57,140 --> 00:01:04,120
+test it out here you can say IFC wall and then stroke this a blue just to test
+
+10
+00:01:04,120 --> 00:01:11,200
+it out and so if we like that rule we can basically copy and paste that into
+
+11
+00:01:11,200 --> 00:01:22,080
+our default CSS file and same applies to this one if we want to create a rule for
+
+12
+00:01:22,080 --> 00:01:34,380
+that we just replace this one dot and now it's just the those concrete walls
+
+13
+00:01:34,380 --> 00:01:41,940
+that take on the blue outline so again if we like that copy it go to our
+
+14
+00:01:41,940 --> 00:01:51,820
+default CSS and we're just gonna place it in here you can say save and go back
+
+15
+00:01:51,880 --> 00:01:59,039
+here and then rerun the drawing and hopefully those concrete walls be blue
+
+16
+00:01:59,039 --> 00:02:06,320
+so we can verify that again there we go okay so you're probably wondering where
+
+17
+00:02:06,320 --> 00:02:12,920
+this name cut came from here you are maybe you know already it came from the
+
+18
+00:02:12,920 --> 00:02:19,200
+name of the layer set it's attached to that wall so here if you remember what
+
+19
+00:02:19,200 --> 00:02:28,380
+we did there so we can now change this to say concrete instead say okay and
+
+20
+00:02:28,380 --> 00:02:39,299
+then rerun the drawing and there we go our walls are have a concrete texture
+
+21
+00:02:39,299 --> 00:02:47,859
+now so if you're right click on that same wall here you can see how that's
+
+22
+00:02:47,860 --> 00:02:54,300
+changed that class has changed there if we go back to our default CSS it's
+
+23
+00:02:54,300 --> 00:02:59,660
+actually pulling off of this rule now so we can ultimately delete this one because
+
+24
+00:02:59,660 --> 00:03:07,140
+we don't need it anymore and again just for giggles we can rerun it see if it
+
+25
+00:03:07,140 --> 00:03:09,860
+works again
+
+26
+00:03:09,860 --> 00:03:23,780
+so you can actually add more classes to this group if you want to in order to do
+
+27
+00:03:23,780 --> 00:03:32,740
+that you would go back to your selector syntax documentation and scroll down to
+
+28
+00:03:32,740 --> 00:03:43,860
+this area here so let's say we want to add a class that tells us what story
+
+29
+00:03:43,860 --> 00:03:55,180
+that walls in so I'm going to copy this go back to our bones I file and I want
+
+30
+00:03:55,180 --> 00:04:00,700
+to select the drawing boundaries there go to object information and we're going
+
+31
+00:04:00,700 --> 00:04:10,019
+to go to our drawing properties and I'm going to put story in metadata so that's
+
+32
+00:04:10,019 --> 00:04:18,740
+going to basically add story information to that SVG now when we run it so go
+
+33
+00:04:18,740 --> 00:04:31,820
+back to rerun the drawing right click on the wall and now you can see it has
+
+34
+00:04:31,820 --> 00:04:38,940
+added a class with the story information here as you can see it's a lot of
+
+35
+00:04:38,940 --> 00:04:51,700
+gobbledygook for example that is the class name that is the good or the
+
+36
+00:04:51,700 --> 00:05:00,460
+global ID that's the actual name of the story and that's the entity number but
+
+37
+00:05:00,460 --> 00:05:03,940
+let's say we just want the we want the name we don't want all this other crap
+
+38
+00:05:04,180 --> 00:05:13,180
+so let's go back to properties again and now we're just going to say hey I don't
+
+39
+00:05:13,180 --> 00:05:20,540
+want all that I just want the name okay we run it again
+
+40
+00:05:20,540 --> 00:05:40,860
+so there it's a little simpler class and now again if we want to style based on that
+
+41
+00:05:40,860 --> 00:05:57,580
+what aqua so it's coloring all those things that have that are in the basement story so
+
+42
+00:05:57,580 --> 00:06:03,780
+so if we go back to our selector syntax documentation we use story but now let's
+
+43
+00:06:03,780 --> 00:06:12,219
+try to use materials and see what happens so before we do that I'm gonna do change a couple
+
+44
+00:06:12,219 --> 00:06:19,619
+of things in our materials so 8 inch concrete wall material I'm gonna give it a category concrete
+
+45
+00:06:19,620 --> 00:06:36,740
+and say this is the concrete description say okay and insulation rigid insulation
+
+46
+00:06:36,740 --> 00:06:53,420
+insulation category and insulation description and save and you notice it's categorized it or
+
+47
+00:06:53,420 --> 00:07:02,820
+put it in folders essentially there so select the boundary of the drawing and go to your properties
+
+48
+00:07:02,820 --> 00:07:13,860
+and we're gonna change this to materials right that's what it said on the slide yep materials
+
+49
+00:07:13,860 --> 00:07:32,620
+okay and we're gonna go to run the drawing right click on it well and there you see it's one
+
+50
+00:07:32,940 --> 00:07:40,060
+humongous class with all that information in it obviously we probably don't want all that
+
+51
+00:07:40,060 --> 00:07:52,140
+information in in there so let's let's try to just show the categories so back to drawing
+
+52
+00:07:52,140 --> 00:08:04,860
+properties and we're gonna say that cat say okay run the drawing again
+
+53
+00:08:04,860 --> 00:08:25,500
+there we go that is a little better break down so you can see however it puts both the
+
+54
+00:08:25,500 --> 00:08:32,140
+insulation layer and the concrete layer in there but let's say we just want one of those
+
+55
+00:08:32,140 --> 00:08:48,819
+go back again properties and let's say we just want that first layer see what happens
+
+56
+00:09:02,140 --> 00:09:12,380
+all right here we go we're starting to narrow down to it now all right so again if we want
+
+57
+00:09:12,380 --> 00:09:25,860
+to make a class for that dot insulation and stroke green there we go and now if you want to do you
+
+58
+00:09:25,860 --> 00:09:38,620
+like that color go back to your default CSS type it in there save it and now hopefully when we run
+
+59
+00:09:38,620 --> 00:09:43,020
+the drawing it should be remain green so there we go
+
diff --git a/097000_20250313_1542 - Creating a demolition plan with CSS rules/097000_20250313_1542 - Creating a demolition plan with CSS rules.srt b/097000_20250313_1542 - Creating a demolition plan with CSS rules/097000_20250313_1542 - Creating a demolition plan with CSS rules.srt
new file mode 100644
index 0000000..6ba9cee
--- /dev/null
+++ b/097000_20250313_1542 - Creating a demolition plan with CSS rules/097000_20250313_1542 - Creating a demolition plan with CSS rules.srt
@@ -0,0 +1,152 @@
+1
+00:00:00,000 --> 00:00:06,640
+So now with our newfound knowledge of how to change the default CSS file, let's use
+
+2
+00:00:06,640 --> 00:00:14,920
+that knowledge to create a demolition plan where objects that we're going to demo in
+
+3
+00:00:14,920 --> 00:00:23,480
+a certain phase will render red or dashed lines that are red and then the existing objects
+
+4
+00:00:23,480 --> 00:00:26,540
+will be rendered blue.
+
+5
+00:00:26,540 --> 00:00:36,280
+So before I do that, let me isolate the walls here just so I can better select things.
+
+6
+00:00:36,280 --> 00:00:44,140
+So we are, if you remember last time we added this pset wall common with the status existing
+
+7
+00:00:44,140 --> 00:00:54,420
+to that wall, I am going to select all those wall types and I'm going to remove that pset
+
+8
+00:00:54,420 --> 00:01:04,379
+and instead I'm going to add an epset status there and add it and these are going to be
+
+9
+00:01:04,379 --> 00:01:13,180
+existing and I got a copy to all of the selected ones.
+
+10
+00:01:13,180 --> 00:01:21,180
+And I'm going to just duplicate this and I'm going to just extend it to there, extend that
+
+11
+00:01:21,180 --> 00:01:29,260
+to there and I'm going to just duplicate this and move it over a little bit.
+
+12
+00:01:29,260 --> 00:01:36,620
+Select these two new walls, actually they're going to be existing walls and add that pset
+
+13
+00:01:36,620 --> 00:01:41,620
+to it, to those again and then they're going to be existing, I'm going to pull this out
+
+14
+00:01:41,620 --> 00:01:45,180
+so you can see it, existing and demolition.
+
+15
+00:01:45,180 --> 00:01:50,020
+Copy it to both walls and say okay.
+
+16
+00:01:50,300 --> 00:02:02,780
+Now we want to tell the drawing to export that information to the SVG file.
+
+17
+00:02:02,780 --> 00:02:10,500
+So go back to the drawing properties again and now we're going to still keep that because
+
+18
+00:02:10,500 --> 00:02:11,500
+we want that.
+
+19
+00:02:11,500 --> 00:02:18,740
+We're going to add a comma and we're going to add in this here, this epset status dot
+
+20
+00:02:18,740 --> 00:02:24,700
+status so that's going to export out whether it's a demolished wall or whether it's existing
+
+21
+00:02:24,700 --> 00:02:25,700
+wall.
+
+22
+00:02:25,700 --> 00:02:26,700
+Say okay.
+
+23
+00:02:26,700 --> 00:02:41,060
+Now we run the drawing and we're going to just select those walls there and just see
+
+24
+00:02:41,060 --> 00:02:44,500
+what classes came out of it.
+
+25
+00:02:44,540 --> 00:02:51,220
+So here it exported out that status information as you can see there.
+
+26
+00:02:51,220 --> 00:02:59,460
+So now in our default CSS file, which is over here, we can add in those new classes and
+
+27
+00:02:59,460 --> 00:03:05,860
+you can see off camera I've already added those in and commented them out so I'm going
+
+28
+00:03:05,860 --> 00:03:09,140
+to comment them out.
+
+29
+00:03:09,140 --> 00:03:13,860
+So this is the rule for existing objects.
+
+30
+00:03:13,860 --> 00:03:15,300
+We're going to color blue.
+
+31
+00:03:15,300 --> 00:03:23,300
+I have this different stroke colored blue and when you line them up one class to the
+
+32
+00:03:23,300 --> 00:03:33,780
+next connected with a dot, it basically requires that you satisfy both the rules.
+
+33
+00:03:33,780 --> 00:03:40,020
+So an object needs to have both a cut class and this class.
+
+34
+00:03:40,020 --> 00:03:45,340
+And so again off camera I added this too.
+
+35
+00:03:45,340 --> 00:03:49,900
+So this will render the demolished walls.
+
+36
+00:03:49,900 --> 00:03:58,100
+So if I save that, go back here and rerun the drawing, hopefully things will change.
+
+37
+00:03:58,100 --> 00:04:01,460
+Ah there we go.
+
+38
+00:04:01,460 --> 00:04:08,580
+So the walls, existing walls are blue and that wall demoed walls is the red dash red.
+
diff --git a/098000_20250313_1802 - Clean up demolition plan/098000_20250313_1802 - Clean up demolition plan.srt b/098000_20250313_1802 - Clean up demolition plan/098000_20250313_1802 - Clean up demolition plan.srt
new file mode 100644
index 0000000..35203d7
--- /dev/null
+++ b/098000_20250313_1802 - Clean up demolition plan/098000_20250313_1802 - Clean up demolition plan.srt
@@ -0,0 +1,356 @@
+1
+00:00:00,000 --> 00:00:03,020
+So off camera I cleaned up this floor plan a little bit
+
+2
+00:00:04,680 --> 00:00:08,300
+Organized these tags here put in some more dimensions
+
+3
+00:00:09,960 --> 00:00:11,960
+If you run the drawing
+
+4
+00:00:14,880 --> 00:00:16,880
+If you run the drawing
+
+5
+00:00:23,200 --> 00:00:25,200
+If you run the drawing
+
+6
+00:00:30,880 --> 00:00:33,620
+You notice I cleaned up all the crazy colors I
+
+7
+00:00:37,040 --> 00:00:38,840
+Adjusted the default
+
+8
+00:00:38,840 --> 00:00:44,320
+CSS this shows you the diff between what it was and what it is now
+
+9
+00:00:45,080 --> 00:00:47,080
+you can see I
+
+10
+00:00:47,080 --> 00:00:49,879
+added a new font there I
+
+11
+00:00:50,600 --> 00:00:52,600
+changed some colors for the
+
+12
+00:00:53,879 --> 00:00:55,879
+Cut stroke
+
+13
+00:00:56,140 --> 00:00:58,140
+colors for the projection and
+
+14
+00:00:58,500 --> 00:01:01,060
+Then some colors for the annotation
+
+15
+00:01:02,780 --> 00:01:08,220
+And some other ones down here as well, so just made a few changes to make it more sane
+
+16
+00:01:13,340 --> 00:01:15,620
+So this for this basement floor plan
+
+17
+00:01:16,300 --> 00:01:18,980
+You should not show the demo
+
+18
+00:01:19,540 --> 00:01:20,820
+walls
+
+19
+00:01:20,820 --> 00:01:23,140
+So let's actually create a new
+
+20
+00:01:24,980 --> 00:01:26,980
+Demolition floor plan
+
+21
+00:01:29,140 --> 00:01:31,140
+Demolition plan
+
+22
+00:01:33,900 --> 00:01:35,900
+Alright we'll stay in that for now
+
+23
+00:01:35,900 --> 00:01:39,860
+so we need to adjust our exclude filters now to
+
+24
+00:01:40,740 --> 00:01:42,920
+Turn those walls off
+
+25
+00:01:44,160 --> 00:01:48,660
+so we could do that here the same way we did before or
+
+26
+00:01:51,820 --> 00:01:53,820
+You can also
+
+27
+00:01:54,820 --> 00:01:56,820
+Go to the drawing parameters here and
+
+28
+00:01:58,059 --> 00:02:01,179
+Exclude it this way so right now we had
+
+29
+00:02:01,740 --> 00:02:05,780
+Excluding the IFC virtual element. Just turning off all those reference planes
+
+30
+00:02:06,460 --> 00:02:08,060
+so now
+
+31
+00:02:08,060 --> 00:02:10,060
+We want to add
+
+32
+00:02:12,180 --> 00:02:14,180
+IFC
+
+33
+00:02:14,260 --> 00:02:16,480
+IFC element
+
+34
+00:02:16,480 --> 00:02:18,480
+I
+
+35
+00:02:18,560 --> 00:02:21,160
+See elements basically a superclass of
+
+36
+00:02:22,079 --> 00:02:24,079
+all the you know
+
+37
+00:02:24,280 --> 00:02:30,160
+Normal elements you find like I've seen wall or I've see slab I've see roof I've see window
+
+38
+00:02:30,160 --> 00:02:33,060
+I've see element basically selects all of them
+
+39
+00:02:34,239 --> 00:02:36,040
+together
+
+40
+00:02:36,040 --> 00:02:40,859
+so and then we want to follow up by comma and then we want to say e
+
+41
+00:02:41,920 --> 00:02:43,760
+pset
+
+42
+00:02:43,760 --> 00:02:45,760
+status status
+
+43
+00:02:47,480 --> 00:02:49,480
+Equals
+
+44
+00:02:50,320 --> 00:02:52,320
+Dem all thish
+
+45
+00:02:53,239 --> 00:02:54,799
+demolish
+
+46
+00:02:54,799 --> 00:03:01,959
+So we're picking all the classes that have a parameter that meets it meets that
+
+47
+00:03:02,440 --> 00:03:09,480
+So this is the piece set the P the property set sorry and this is the property and this is the value
+
+48
+00:03:10,280 --> 00:03:12,280
+So I want to say okay
+
+49
+00:03:13,200 --> 00:03:15,839
+I'm gonna go back to our drawing
+
+50
+00:03:16,920 --> 00:03:20,880
+Inactivate it and hopefully those walls should disappear great
+
+51
+00:03:22,160 --> 00:03:27,000
+Okay, let's now make the demolition plan so before we do
+
+52
+00:03:28,120 --> 00:03:30,120
+I'm gonna
+
+53
+00:03:30,280 --> 00:03:32,280
+Assign some parameters here
+
+54
+00:03:33,920 --> 00:03:42,079
+So that wall is existing okay, that's correctly signed, so I'm gonna hide that okay
+
+55
+00:03:46,519 --> 00:03:51,519
+These walls here that they are just sing and demolish I'm gonna hide those
+
+56
+00:03:52,959 --> 00:03:54,959
+So it looks like
+
+57
+00:03:55,399 --> 00:03:57,480
+My own seer we want
+
+58
+00:03:58,359 --> 00:03:59,899
+this
+
+59
+00:03:59,899 --> 00:04:01,899
+footing and slab
+
+60
+00:04:02,720 --> 00:04:06,440
+That is existing as well, so we're gonna select the types
+
+61
+00:04:08,480 --> 00:04:12,280
+That the only thing that's gonna be existing let's make these distinct you
+
+62
+00:04:14,120 --> 00:04:16,120
+Select all those types
+
+63
+00:04:17,000 --> 00:04:19,000
+And we're gonna
+
+64
+00:04:21,280 --> 00:04:24,120
+Add the status property set there and
+
+65
+00:04:25,720 --> 00:04:32,160
+Existing copy to everything say okay now. We're gonna hide those okay? Oh
+
+66
+00:04:33,720 --> 00:04:35,720
+Let's make these existing to
+
+67
+00:04:41,680 --> 00:04:43,680
+Existing copy
+
+68
+00:04:43,680 --> 00:04:51,320
+Okay, okay, okay, and then everything else
+
+69
+00:04:57,880 --> 00:05:03,280
+Signal the times here, I'm gonna assign that to new
+
+70
+00:05:05,320 --> 00:05:07,320
+So piece set
+
+71
+00:05:09,200 --> 00:05:11,200
+Oops sorry
+
+72
+00:05:14,000 --> 00:05:16,000
+Actually I'm gonna read you this again
+
+73
+00:05:20,920 --> 00:05:24,800
+I want to turn these off just to make sure I'm not selecting it
+
+74
+00:05:27,800 --> 00:05:29,800
+Okay
+
+75
+00:05:31,200 --> 00:05:33,200
+All right piece it
+
+76
+00:05:33,520 --> 00:05:35,520
+and
+
+77
+00:05:35,560 --> 00:05:37,720
+This is new copy
+
+78
+00:05:38,960 --> 00:05:40,960
+Say okay
+
+79
+00:05:41,320 --> 00:05:43,599
+Alright now let's go back to our demo plan
+
+80
+00:05:48,120 --> 00:05:53,320
+Okay now we want to turn off
+
+81
+00:05:55,120 --> 00:06:00,900
+The new status go to the properties again
+
+82
+00:06:05,200 --> 00:06:07,200
+And
+
+83
+00:06:10,960 --> 00:06:12,960
+Just
+
+84
+00:06:15,520 --> 00:06:18,640
+Gonna paste this in here plus
+
+85
+00:06:20,560 --> 00:06:24,039
+So I see element status equals new
+
+86
+00:06:24,960 --> 00:06:26,960
+Say okay
+
+87
+00:06:27,080 --> 00:06:29,640
+And go back to activate drawing and hopefully
+
+88
+00:06:33,960 --> 00:06:38,159
+There we go let's rerun this drawing again and turn off cache
+
+89
+00:06:40,960 --> 00:06:44,320
+All right
+
diff --git a/099000_20250314_1058 - Creating a new tag type/099000_20250314_1058 - Creating a new tag type.srt b/099000_20250314_1058 - Creating a new tag type/099000_20250314_1058 - Creating a new tag type.srt
new file mode 100644
index 0000000..0947b0f
--- /dev/null
+++ b/099000_20250314_1058 - Creating a new tag type/099000_20250314_1058 - Creating a new tag type.srt
@@ -0,0 +1,276 @@
+1
+00:00:00,000 --> 00:00:07,560
+So if we turn on extras here so we can grab our material tag.
+
+2
+00:00:07,560 --> 00:00:15,440
+You see our material tag is driven by that material tag type here.
+
+3
+00:00:15,440 --> 00:00:22,400
+And if you go down to property sets, you'll notice that this EPCAT annotation property
+
+4
+00:00:22,400 --> 00:00:25,260
+set is attached to that tag.
+
+5
+00:00:25,260 --> 00:00:31,140
+And it has a property called symbol and in that for this particular one it says rectangle
+
+6
+00:00:31,140 --> 00:00:32,600
+tag.
+
+7
+00:00:32,600 --> 00:00:45,500
+So what that corresponds to then is basically the geometry in the symbols SVG file.
+
+8
+00:00:45,500 --> 00:00:51,100
+So here I highlighted already the rectangle tag and then it just has a simple rectangle
+
+9
+00:00:51,100 --> 00:00:52,420
+in it.
+
+10
+00:00:52,420 --> 00:01:01,840
+So if we go back to the file and run it.
+
+11
+00:01:01,840 --> 00:01:02,840
+Zoom in.
+
+12
+00:01:02,840 --> 00:01:04,700
+So here's that.
+
+13
+00:01:04,700 --> 00:01:06,740
+Too much.
+
+14
+00:01:06,740 --> 00:01:09,320
+Here's that rectangle from that file.
+
+15
+00:01:09,320 --> 00:01:16,320
+So obviously in this scenario the rectangle would be too small for that verbiage there.
+
+16
+00:01:16,320 --> 00:01:22,699
+So if we want to go back and change it, it's easy enough.
+
+17
+00:01:22,699 --> 00:01:29,800
+So we can for example stretch this out.
+
+18
+00:01:29,800 --> 00:01:33,880
+Stretch that out.
+
+19
+00:01:33,880 --> 00:01:46,100
+And we could, if we wanted to, also change the color, stroke color.
+
+20
+00:01:46,100 --> 00:01:49,940
+Let's just give it a blue color.
+
+21
+00:01:49,940 --> 00:01:50,940
+There we go.
+
+22
+00:01:50,940 --> 00:01:59,419
+So save and go back to the bonsai file and run it again and see what happens.
+
+23
+00:01:59,419 --> 00:02:01,899
+Oh, there we go.
+
+24
+00:02:01,920 --> 00:02:05,360
+So just a larger rectangle there.
+
+25
+00:02:05,360 --> 00:02:14,120
+So if we go back to the file and the annotation, you'll notice that the demo file has these
+
+26
+00:02:14,120 --> 00:02:17,680
+pre-populated tag names or tag types.
+
+27
+00:02:17,680 --> 00:02:23,840
+So space, name, material door, but there is not a wall tag yet.
+
+28
+00:02:23,840 --> 00:02:27,200
+So we can actually make one from an existing tag.
+
+29
+00:02:27,200 --> 00:02:31,000
+So let's make one from this existing material tag.
+
+30
+00:02:31,000 --> 00:02:34,740
+So select the instance and then select the type.
+
+31
+00:02:34,740 --> 00:02:37,180
+Then we're going to duplicate the type.
+
+32
+00:02:37,180 --> 00:02:45,460
+I'm going to select it over here and we are going to edit the type name.
+
+33
+00:02:45,460 --> 00:02:48,780
+Let's say wall tag.
+
+34
+00:02:48,780 --> 00:02:53,700
+Say OK.
+
+35
+00:02:53,700 --> 00:03:00,980
+Now we have to change the symbol property down here.
+
+36
+00:03:00,980 --> 00:03:09,200
+I'm going to just say wall tag.
+
+37
+00:03:09,200 --> 00:03:14,399
+So now we go back to our symbols file here.
+
+38
+00:03:14,399 --> 00:03:21,480
+And this was the tag or the symbol that we modified for that material tag.
+
+39
+00:03:21,480 --> 00:03:24,640
+So let's actually just duplicate this.
+
+40
+00:03:24,640 --> 00:03:25,959
+Duplicate.
+
+41
+00:03:25,960 --> 00:03:30,260
+I'm going to turn this off.
+
+42
+00:03:30,260 --> 00:03:31,820
+Open this up.
+
+43
+00:03:31,820 --> 00:03:34,900
+All right.
+
+44
+00:03:34,900 --> 00:03:39,220
+And we are going to rename this wall tag.
+
+45
+00:03:39,220 --> 00:03:44,380
+Oh, I didn't want to take it.
+
+46
+00:03:44,380 --> 00:03:49,420
+Wall tag, there we go.
+
+47
+00:03:49,420 --> 00:03:56,880
+So unfortunately you have to rename it in another location as well.
+
+48
+00:03:56,880 --> 00:04:03,480
+You have to go to this XML editor.
+
+49
+00:04:03,480 --> 00:04:07,640
+And this is the tag we just made here.
+
+50
+00:04:07,640 --> 00:04:13,040
+And so you actually have to see it says Inkscape label, which we just did.
+
+51
+00:04:13,040 --> 00:04:18,659
+We also have to change the ID because the ID is basically what Bonsai is looking for.
+
+52
+00:04:18,660 --> 00:04:19,660
+So wall tag.
+
+53
+00:04:19,660 --> 00:04:23,720
+OK, and you can close it if you want.
+
+54
+00:04:23,720 --> 00:04:30,120
+So I'm just going to actually let's change the geometry of it.
+
+55
+00:04:30,120 --> 00:04:38,280
+I'm going to convert it to a path first.
+
+56
+00:04:38,280 --> 00:04:44,100
+It's a rectangular object object to path.
+
+57
+00:04:44,100 --> 00:04:49,200
+So let's just make a geometry.
+
+58
+00:04:49,200 --> 00:04:52,280
+Something that's different.
+
+59
+00:04:52,280 --> 00:04:54,280
+A different wall tag.
+
+60
+00:04:54,280 --> 00:04:58,600
+OK, I see that's good enough.
+
+61
+00:04:58,600 --> 00:05:00,920
+OK, so save the file.
+
+62
+00:05:00,920 --> 00:05:06,080
+And then hopefully when you go back, we've got to change this.
+
+63
+00:05:06,080 --> 00:05:19,979
+OK, so this is now a material tag and we want to change that to a wall tag.
+
+64
+00:05:19,979 --> 00:05:23,380
+And OK, the last thing we got to change.
+
+65
+00:05:23,380 --> 00:05:27,260
+We want to change this.
+
+66
+00:05:27,260 --> 00:05:31,219
+We want to pull out the type dot name.
+
+67
+00:05:31,220 --> 00:05:42,040
+OK, and hopefully, when we run the drawing.
+
+68
+00:05:42,040 --> 00:05:45,280
+It takes on the new simple geometry.
+
+69
+00:05:45,280 --> 00:05:46,600
+There you go.
+
diff --git a/100000_20250314_1321 - Importing a CAD file/100000_20250314_1321 - Importing a CAD file.srt b/100000_20250314_1321 - Importing a CAD file/100000_20250314_1321 - Importing a CAD file.srt
new file mode 100644
index 0000000..1dd848e
--- /dev/null
+++ b/100000_20250314_1321 - Importing a CAD file/100000_20250314_1321 - Importing a CAD file.srt
@@ -0,0 +1,160 @@
+1
+00:00:00,000 --> 00:00:06,060
+So off-camera I copied this new wall tag that we made in the last video around to
+
+2
+00:00:06,060 --> 00:00:12,380
+the other walls. Then I renamed this wall type here that concrete wall type to use
+
+3
+00:00:12,380 --> 00:00:26,560
+our wall naming nomenclature. If we run the drawing you can see the tag
+
+4
+00:00:26,560 --> 00:00:35,160
+throughout the project there. So there is a workflow that a lot of architects and
+
+5
+00:00:35,160 --> 00:00:41,040
+engineers use to import a CAD file into your model to use it as a reference and
+
+6
+00:00:41,040 --> 00:00:49,980
+so I'd like to show that one way to do that in Bonsai. So let's start with a new
+
+7
+00:00:49,980 --> 00:00:59,220
+collection and name it CAD import and then have it selected. Then go to import
+
+8
+00:00:59,220 --> 00:01:07,100
+and do this DXF here and on your instance, so your Blender instance, it
+
+9
+00:01:07,100 --> 00:01:12,979
+might not be there and if it's not you would go to preference and get
+
+10
+00:01:12,979 --> 00:01:19,580
+extensions and type DXF and then it'll have you install it. So after installing
+
+11
+00:01:19,580 --> 00:01:27,539
+it it should be there. So we want to go to import DXF navigate to where the
+
+12
+00:01:27,539 --> 00:01:33,700
+file is. These settings here options you can keep as is. I don't usually modify
+
+13
+00:01:33,700 --> 00:01:44,300
+those and say import. Okay zoom into the geometry. So there is the geometry that
+
+14
+00:01:44,300 --> 00:01:53,899
+came in. So the steps I take from here is I select everything and I apply all
+
+15
+00:01:53,899 --> 00:01:59,539
+transformations. Sometimes you'll have weird scaling issues and whatnot that
+
+16
+00:01:59,539 --> 00:02:13,160
+comes in so I like to do that and then convert to mesh. And as you can see the
+
+17
+00:02:13,160 --> 00:02:20,480
+various geometry's are broken out into what kind of classes they are. You can
+
+18
+00:02:20,480 --> 00:02:25,760
+use that to convert it to you know their corresponding classes in the IFC file if
+
+19
+00:02:25,760 --> 00:02:29,720
+you want to but for this instance I'm just going to use this as reference. I
+
+20
+00:02:29,720 --> 00:02:35,560
+don't need it broken down in that level so I'm just going to select everything
+
+21
+00:02:35,560 --> 00:02:43,560
+and I'm going to join them into one mesh. It's just one mesh there. So from here we
+
+22
+00:02:43,560 --> 00:02:55,120
+have to if you tab into it and select something and turn on the edge length so
+
+23
+00:02:55,120 --> 00:03:03,760
+you can tell. You notice how it's there edge length there is hard to read. If
+
+24
+00:03:03,760 --> 00:03:15,760
+that's the case you can. So go to themes there the 3d viewport and scroll down
+
+25
+00:03:15,760 --> 00:03:23,079
+and try to find edge length text and we want to change this to something that's
+
+26
+00:03:23,079 --> 00:03:31,120
+easier to read. It's not a little red. Alright so I know in this file that
+
+27
+00:03:31,120 --> 00:03:39,480
+dimension there is 3 feet and it reads 62.5 feet so obviously we need to do a
+
+28
+00:03:39,480 --> 00:03:49,720
+conversion so I'm going to do 3 divided by 6 2.5 that's 0.048 so I'm going to
+
+29
+00:03:49,720 --> 00:04:01,360
+select all that a scale and point zero for eight and then I'm going to check
+
+30
+00:04:01,360 --> 00:04:10,960
+okay great now it's three foot so now that we scaled everything we can move it
+
+31
+00:04:10,960 --> 00:04:17,360
+into place relative to where we want it
+
+32
+00:04:19,720 --> 00:04:38,200
+and I need to do this over negative 0.75 inches down I believe that will
+
+33
+00:04:38,200 --> 00:04:45,000
+correspond to the floor plan okay great so from here then you'll go and assign a
+
+34
+00:04:45,160 --> 00:04:54,400
+class and so there's I guess no right or wrong way a clap of the correct class to
+
+35
+00:04:54,400 --> 00:05:02,800
+use to assign to this I like to use it's here I've see building element proxy
+
+36
+00:05:02,800 --> 00:05:10,080
+that's basically if you don't have a class in mind you can use that that may
+
+37
+00:05:10,080 --> 00:05:16,919
+apply to anything else so go user-defined and we're just doing cad
+
+38
+00:05:16,919 --> 00:05:31,280
+import and say assign so there you go it's in the IFC file now install we can
+
+39
+00:05:31,280 --> 00:05:40,640
+move it up to like one foot let's say so if we go to our first floor plan
+
+40
+00:05:40,640 --> 00:05:49,520
+should be there right there save now
+
diff --git a/101000_20250314_1409 - Moving CAD import to paper space/101000_20250314_1409 - Moving CAD import to paper space.srt b/101000_20250314_1409 - Moving CAD import to paper space/101000_20250314_1409 - Moving CAD import to paper space.srt
new file mode 100644
index 0000000..60a1b47
--- /dev/null
+++ b/101000_20250314_1409 - Moving CAD import to paper space/101000_20250314_1409 - Moving CAD import to paper space.srt
@@ -0,0 +1,84 @@
+1
+00:00:00,000 --> 00:00:06,920
+So off camera I massage this CAD file a little bit. I extended these walls to six
+
+2
+00:00:06,920 --> 00:00:13,920
+inches out to align with the model and then I modified these walls a little bit.
+
+3
+00:00:13,920 --> 00:00:19,940
+So right now this CAD file is essentially in model space. You know if
+
+4
+00:00:19,940 --> 00:00:25,020
+you go to orthographic view you can still see it. But what if you just want
+
+5
+00:00:25,020 --> 00:00:31,740
+to put this CAD file in so-called paper space so it's just related to the
+
+6
+00:00:31,740 --> 00:00:41,420
+drawing. You can actually do that. I'm going to duplicate this drawing. Just
+
+7
+00:00:41,420 --> 00:00:44,220
+name it CAD.
+
+8
+00:00:48,780 --> 00:00:51,940
+Activate it.
+
+9
+00:00:55,020 --> 00:01:03,820
+Alright go to your annotation tool. Go up to your line and click on your
+
+10
+00:01:03,820 --> 00:01:12,180
+launcher and we're gonna do CAD.
+
+11
+00:01:12,180 --> 00:01:25,980
+And you want to click on this geometric type. Say save and make it active and put
+
+12
+00:01:25,980 --> 00:01:32,700
+your 3d cursor somewhere and add it. So it just creates a generic line to start
+
+13
+00:01:32,700 --> 00:01:40,640
+things off. So we want to essentially join that CAD file to that line. So
+
+14
+00:01:40,640 --> 00:01:50,440
+before we do we need to break it. And now it's just dumb vanilla geometry. So
+
+15
+00:01:50,440 --> 00:01:56,480
+we'll select that and then that new type that we made and we want to right-click
+
+16
+00:01:56,480 --> 00:02:04,680
+and join. So one other additional step not obvious you have to go here to
+
+17
+00:02:04,680 --> 00:02:15,760
+manually save representation. I think it should be in the file now. So if we go to
+
+18
+00:02:15,760 --> 00:02:22,200
+orthographic it's gone it's not there anymore. But if we go back to our drawing
+
+19
+00:02:22,200 --> 00:02:28,640
+it should be there. So that's now in paper space so to speak. So you then can
+
+20
+00:02:28,640 --> 00:02:37,519
+select the CAD file. Go up here to edit and then we want to delete this.
+
+21
+00:02:37,519 --> 00:02:46,560
+Tab out of it and then just to make sure manually save representation again.
+
diff --git a/102000_20250314_1430 - Import background image/102000_20250314_1430 - Import background image.srt b/102000_20250314_1430 - Import background image/102000_20250314_1430 - Import background image.srt
new file mode 100644
index 0000000..c9cc055
--- /dev/null
+++ b/102000_20250314_1430 - Import background image/102000_20250314_1430 - Import background image.srt
@@ -0,0 +1,124 @@
+1
+00:00:00,000 --> 00:00:07,000
+So let's say you don't have a CAD file to reference, you only have a scanned floor plan for example.
+
+2
+00:00:07,000 --> 00:00:11,000
+You can still import an image and scale it to the plan.
+
+3
+00:00:11,000 --> 00:00:17,000
+So let's do that. Let's duplicate that floor.
+
+4
+00:00:17,000 --> 00:00:24,000
+And this will be just image.
+
+5
+00:00:24,000 --> 00:00:29,000
+Activate it.
+
+6
+00:00:29,000 --> 00:00:35,000
+Okay, put the 3D cursor somewhere.
+
+7
+00:00:35,000 --> 00:00:39,000
+Go to annotation tool. Pull this down to image.
+
+8
+00:00:39,000 --> 00:00:46,000
+And we want to add. And then it will prompt you to ask where your jpg is.
+
+9
+00:00:46,000 --> 00:00:51,000
+Navigate to it. Add it in world there.
+
+10
+00:00:51,000 --> 00:00:56,000
+You can rotate it. Maybe we don't want to rotate it.
+
+11
+00:00:56,000 --> 00:01:01,000
+So of course the scale is off.
+
+12
+00:01:01,000 --> 00:01:06,000
+So use a similar approach we did with the CAD file.
+
+13
+00:01:06,000 --> 00:01:11,000
+We can measure this edge here.
+
+14
+00:01:11,000 --> 00:01:16,000
+We have about 5 inches or so.
+
+15
+00:01:16,000 --> 00:01:21,000
+Okay.
+
+16
+00:01:21,000 --> 00:01:26,000
+So we have 3 feet divided by 5 inches.
+
+17
+00:01:26,000 --> 00:01:31,000
+37.2 scaling.
+
+18
+00:01:31,000 --> 00:01:36,000
+Before you can scale.
+
+19
+00:01:36,000 --> 00:01:41,000
+You can't scale in object mode here.
+
+20
+00:01:41,000 --> 00:01:46,000
+As you can see you have to tab into it twice.
+
+21
+00:01:46,000 --> 00:01:51,000
+And then you can scale.
+
+22
+00:01:51,000 --> 00:01:56,000
+Tab out of it.
+
+23
+00:01:56,000 --> 00:02:01,000
+And you can locate it in the Z.
+
+24
+00:02:01,000 --> 00:02:06,000
+Put it in place.
+
+25
+00:02:06,000 --> 00:02:11,000
+Actually I'm going to bring it down.
+
+26
+00:02:11,000 --> 00:02:16,000
+Negative.
+
+27
+00:02:16,000 --> 00:02:21,000
+There we go.
+
+28
+00:02:21,000 --> 00:02:26,000
+Alright.
+
+29
+00:02:26,000 --> 00:02:31,000
+We won't get exact but just get the idea.
+
+30
+00:02:31,000 --> 00:02:36,000
+You can use that now as a background.
+
+31
+00:02:36,000 --> 00:02:41,000
+If you save the .ISF file it should be there when you open it.
+
diff --git a/103000_20250317_1052 - Importing & modifying online BIM assets/103000_20250317_1052 - Importing & modifying online BIM assets.srt b/103000_20250317_1052 - Importing & modifying online BIM assets/103000_20250317_1052 - Importing & modifying online BIM assets.srt
new file mode 100644
index 0000000..423e42a
--- /dev/null
+++ b/103000_20250317_1052 - Importing & modifying online BIM assets/103000_20250317_1052 - Importing & modifying online BIM assets.srt
@@ -0,0 +1,880 @@
+1
+00:00:00,000 --> 00:00:02,440
+So a few things I changed off camera.
+
+2
+00:00:02,440 --> 00:00:05,900
+I imported this wall type here.
+
+3
+00:00:05,900 --> 00:00:09,500
+From the OD Bonsai template here,
+
+4
+00:00:09,500 --> 00:00:12,080
+there's a number of wall types there.
+
+5
+00:00:12,080 --> 00:00:13,640
+I think I imported that one there.
+
+6
+00:00:16,480 --> 00:00:19,860
+Then I also added a second floor.
+
+7
+00:00:19,860 --> 00:00:23,000
+There. And.
+
+8
+00:00:25,340 --> 00:00:26,040
+I
+
+9
+00:00:26,040 --> 00:00:31,240
+changed the.
+
+10
+00:00:31,240 --> 00:00:34,340
+This folder here used to be called materials
+
+11
+00:00:34,340 --> 00:00:36,700
+and now it's called OD textures.
+
+12
+00:00:36,700 --> 00:00:39,040
+That's because it was easier
+
+13
+00:00:39,040 --> 00:00:41,340
+copying materials from that OD
+
+14
+00:00:41,340 --> 00:00:43,599
+texture into there and having
+
+15
+00:00:43,599 --> 00:00:45,800
+the paths be the same.
+
+16
+00:00:45,800 --> 00:00:48,200
+That way I don't have to
+
+17
+00:00:48,200 --> 00:00:49,879
+manually change the path,
+
+18
+00:00:49,879 --> 00:00:51,920
+so that's just a.
+
+19
+00:00:51,920 --> 00:00:53,080
+A quick change there.
+
+20
+00:00:56,040 --> 00:01:01,839
+So a workflow that architects and
+
+21
+00:01:01,839 --> 00:01:05,280
+engineers use quite a bit is to take.
+
+22
+00:01:05,280 --> 00:01:07,400
+Online BIM content and import
+
+23
+00:01:07,400 --> 00:01:09,039
+that into their model.
+
+24
+00:01:09,039 --> 00:01:09,880
+For example,
+
+25
+00:01:09,880 --> 00:01:12,720
+this is Anderson window from their website.
+
+26
+00:01:12,720 --> 00:01:16,039
+I imported into Revit and so I wanted
+
+27
+00:01:16,039 --> 00:01:19,200
+to show you how you can export this
+
+28
+00:01:19,200 --> 00:01:22,440
+out to an IFC file and then import
+
+29
+00:01:22,440 --> 00:01:24,840
+that type into Bonsai.
+
+30
+00:01:24,840 --> 00:01:26,680
+So from here.
+
+31
+00:01:26,680 --> 00:01:28,120
+If you're curious,
+
+32
+00:01:28,120 --> 00:01:31,040
+I went to export IFC and I use
+
+33
+00:01:31,040 --> 00:01:32,800
+this I see for reference view.
+
+34
+00:01:37,400 --> 00:01:39,760
+And then I opened that file,
+
+35
+00:01:39,760 --> 00:01:42,760
+essentially here.
+
+36
+00:01:42,760 --> 00:01:44,400
+And if I select the type,
+
+37
+00:01:44,400 --> 00:01:47,680
+you can see that the material.
+
+38
+00:01:50,360 --> 00:01:52,360
+Assignment is done through
+
+39
+00:01:52,360 --> 00:01:55,240
+IFC material constituent set and there's
+
+40
+00:01:55,240 --> 00:01:58,640
+a number of materials in there.
+
+41
+00:01:58,640 --> 00:02:01,800
+So if we open the material library.
+
+42
+00:02:04,120 --> 00:02:06,480
+Expand this here.
+
+43
+00:02:06,480 --> 00:02:09,079
+You'll notice if I click on any material,
+
+44
+00:02:09,079 --> 00:02:11,560
+there is no style.
+
+45
+00:02:11,560 --> 00:02:13,200
+Assigned that material.
+
+46
+00:02:13,200 --> 00:02:13,880
+Unfortunately,
+
+47
+00:02:13,880 --> 00:02:17,280
+Revit doesn't do that for whatever reason.
+
+48
+00:02:17,280 --> 00:02:19,600
+So I like to have it where my styles
+
+49
+00:02:19,600 --> 00:02:21,720
+are applied to the material and then
+
+50
+00:02:21,720 --> 00:02:23,640
+the material applied to the geometry.
+
+51
+00:02:23,640 --> 00:02:25,840
+And since this is not set up that way,
+
+52
+00:02:25,840 --> 00:02:28,480
+I actually just like to start from scratch.
+
+53
+00:02:28,480 --> 00:02:30,400
+So I'm going to do that.
+
+54
+00:02:30,400 --> 00:02:33,760
+So I'm going to select that instance there.
+
+55
+00:02:33,760 --> 00:02:36,840
+And I'm going to break the link.
+
+56
+00:02:36,840 --> 00:02:39,960
+So now it's just dumb geometry.
+
+57
+00:02:39,960 --> 00:02:41,600
+I'm going to name it.
+
+58
+00:02:41,600 --> 00:02:42,480
+Double hung.
+
+59
+00:02:44,560 --> 00:02:49,920
+And. I am going to go to materials.
+
+60
+00:02:49,920 --> 00:02:51,640
+I'm going to delete all those
+
+61
+00:02:51,640 --> 00:02:53,399
+that are attached to it.
+
+62
+00:02:53,399 --> 00:02:56,359
+So it's really dumb now.
+
+63
+00:02:56,359 --> 00:02:58,279
+Go back. OK,
+
+64
+00:02:58,279 --> 00:03:00,880
+I want to sign it window type.
+
+65
+00:03:03,679 --> 00:03:04,679
+And say OK.
+
+66
+00:03:06,799 --> 00:03:12,440
+Alright. And now we want to create.
+
+67
+00:03:12,440 --> 00:03:14,760
+Three styles, three new styles,
+
+68
+00:03:14,760 --> 00:03:18,359
+and then three new materials.
+
+69
+00:03:18,359 --> 00:03:19,959
+So going to styles here,
+
+70
+00:03:19,960 --> 00:03:22,240
+click on that.
+
+71
+00:03:22,240 --> 00:03:27,000
+First style is going to be called GS or generic style.
+
+72
+00:03:27,000 --> 00:03:30,680
+And color. Dark.
+
+73
+00:03:30,680 --> 00:03:35,720
+This is going to be a externally defined surface style.
+
+74
+00:03:35,720 --> 00:03:39,040
+And the next one will call.
+
+75
+00:03:39,040 --> 00:03:39,400
+White.
+
+76
+00:03:42,400 --> 00:03:43,840
+And the next one call.
+
+77
+00:03:43,840 --> 00:03:51,040
+GS glazing.
+
+78
+00:03:51,040 --> 00:03:54,200
+Let's see.
+
+79
+00:03:54,200 --> 00:03:54,520
+OK.
+
+80
+00:03:54,520 --> 00:03:58,640
+So off camera.
+
+81
+00:03:58,640 --> 00:04:04,400
+I created or basically brought over three new material styles
+
+82
+00:04:04,400 --> 00:04:07,480
+or materials into our material library.
+
+83
+00:04:07,480 --> 00:04:09,280
+Those three.
+
+84
+00:04:10,280 --> 00:04:14,520
+And now I'm going to attach our newly created styles
+
+85
+00:04:14,520 --> 00:04:16,800
+to those.
+
+86
+00:04:16,800 --> 00:04:17,480
+Materials.
+
+87
+00:04:40,159 --> 00:04:42,719
+Right.
+
+88
+00:04:42,719 --> 00:04:45,359
+Save and glazing finally.
+
+89
+00:04:50,239 --> 00:04:50,760
+Glazing.
+
+90
+00:04:55,080 --> 00:04:55,479
+Oops.
+
+91
+00:04:58,119 --> 00:05:01,479
+OK, and then going to create three materials,
+
+92
+00:05:01,479 --> 00:05:03,359
+new materials.
+
+93
+00:05:03,359 --> 00:05:08,640
+First one will call GM for generic material.
+
+94
+00:05:08,640 --> 00:05:10,240
+Trim.
+
+95
+00:05:10,240 --> 00:05:11,479
+Dark.
+
+96
+00:05:11,479 --> 00:05:13,360
+I like to use generic material,
+
+97
+00:05:13,360 --> 00:05:14,960
+especially in the early days of design,
+
+98
+00:05:14,960 --> 00:05:18,520
+because I don't know necessarily what it's going to be.
+
+99
+00:05:18,520 --> 00:05:20,360
+It's more important that it's just,
+
+100
+00:05:20,360 --> 00:05:22,719
+I know it's probably going to be a dark material.
+
+101
+00:05:22,719 --> 00:05:26,599
+So it'll be changed later, most likely.
+
+102
+00:05:26,599 --> 00:05:28,200
+And I'm just going to say white.
+
+103
+00:05:31,880 --> 00:05:35,280
+And one last will go.
+
+104
+00:05:35,280 --> 00:05:37,560
+Insulated glazing.
+
+105
+00:05:37,640 --> 00:05:38,640
+We'll commit to this one.
+
+106
+00:05:38,640 --> 00:05:42,040
+We probably know what that's going to be called.
+
+107
+00:05:42,040 --> 00:05:46,920
+And then assign your styles to those materials.
+
+108
+00:05:46,920 --> 00:05:47,800
+Glazing.
+
+109
+00:05:47,800 --> 00:05:48,320
+Assign.
+
+110
+00:05:51,920 --> 00:05:52,400
+Oops.
+
+111
+00:05:55,840 --> 00:05:57,840
+Right.
+
+112
+00:05:57,840 --> 00:06:00,280
+And dark.
+
+113
+00:06:03,640 --> 00:06:05,400
+OK.
+
+114
+00:06:05,400 --> 00:06:10,159
+Now, select the instance or the type.
+
+115
+00:06:10,159 --> 00:06:14,719
+And we want to create a new IFC material constituent set.
+
+116
+00:06:14,719 --> 00:06:18,840
+And we'll start with the dark trim.
+
+117
+00:06:18,840 --> 00:06:22,760
+And then we'll add the other ones, the white one.
+
+118
+00:06:22,760 --> 00:06:24,760
+And we'll add the glazing.
+
+119
+00:06:27,919 --> 00:06:32,520
+And then we have to give it a name, something
+
+120
+00:06:32,520 --> 00:06:33,479
+that we'll recognize.
+
+121
+00:06:33,720 --> 00:06:40,520
+For the dark trim, it's going to be inside trim.
+
+122
+00:06:40,520 --> 00:06:42,520
+OK.
+
+123
+00:06:42,520 --> 00:06:47,080
+And for the white, it'll be outside trim.
+
+124
+00:06:49,920 --> 00:06:54,000
+And for the insulated glazing, it'll just be glazing.
+
+125
+00:06:54,000 --> 00:06:58,680
+These are names that we're going to use when we assign
+
+126
+00:06:58,680 --> 00:07:00,360
+the materials to the geometry.
+
+127
+00:07:00,360 --> 00:07:00,960
+All right.
+
+128
+00:07:00,960 --> 00:07:03,960
+Now, go to representation items here.
+
+129
+00:07:03,960 --> 00:07:05,000
+Click on this.
+
+130
+00:07:05,000 --> 00:07:08,680
+And you'll see all the items that are in there, which
+
+131
+00:07:08,680 --> 00:07:12,000
+is essentially loose geometry.
+
+132
+00:07:12,000 --> 00:07:16,120
+If you tab into it, you can use this
+
+133
+00:07:16,120 --> 00:07:17,480
+to select various things.
+
+134
+00:07:17,480 --> 00:07:22,400
+You can see it's selecting different geometries there.
+
+135
+00:07:22,400 --> 00:07:23,600
+So we're going to go through.
+
+136
+00:07:23,600 --> 00:07:24,720
+We'll select the first one.
+
+137
+00:07:24,720 --> 00:07:26,400
+And we'll see what it's selecting.
+
+138
+00:07:26,400 --> 00:07:28,600
+And then we'll go to the next one.
+
+139
+00:07:28,600 --> 00:07:31,040
+And it looks like here, let's zoom in.
+
+140
+00:07:34,040 --> 00:07:34,840
+What is that?
+
+141
+00:07:34,840 --> 00:07:37,080
+That is the interior.
+
+142
+00:07:37,080 --> 00:07:38,680
+OK.
+
+143
+00:07:38,680 --> 00:07:42,680
+So go down here to no shape aspect.
+
+144
+00:07:42,680 --> 00:07:46,920
+And we are going to say inside trim.
+
+145
+00:07:46,920 --> 00:07:49,920
+Say OK.
+
+146
+00:07:49,920 --> 00:07:51,240
+Go to the next one.
+
+147
+00:07:51,240 --> 00:07:53,560
+Select it.
+
+148
+00:07:53,560 --> 00:07:55,880
+It's inside too.
+
+149
+00:07:55,880 --> 00:07:56,400
+OK.
+
+150
+00:07:56,760 --> 00:07:58,560
+We already created one.
+
+151
+00:07:58,560 --> 00:08:00,239
+So we can just use this here.
+
+152
+00:08:00,239 --> 00:08:01,799
+Inside trim, we've already created it.
+
+153
+00:08:04,520 --> 00:08:05,840
+Let's keep going down through.
+
+154
+00:08:19,400 --> 00:08:20,479
+And find something that's.
+
+155
+00:08:27,280 --> 00:08:32,120
+OK, that one is outside.
+
+156
+00:08:32,120 --> 00:08:36,559
+So we'll go new shape aspect.
+
+157
+00:08:36,559 --> 00:08:39,760
+And then we'll click on outside trim.
+
+158
+00:08:39,760 --> 00:08:43,120
+So I'm going to do this for the rest of these items here.
+
+159
+00:08:43,120 --> 00:08:45,319
+And then I'll get back to you.
+
+160
+00:08:45,319 --> 00:08:46,959
+So I went through all these items
+
+161
+00:08:46,959 --> 00:08:48,319
+and assigned the material.
+
+162
+00:08:51,439 --> 00:08:56,240
+You can see here, you tab out of it.
+
+163
+00:08:56,280 --> 00:08:59,480
+There's our beautiful type.
+
+164
+00:08:59,480 --> 00:09:03,360
+The white on the outside, black on the inside.
+
+165
+00:09:03,360 --> 00:09:06,840
+So now that we have the type and we saved it,
+
+166
+00:09:06,840 --> 00:09:08,600
+let's bring it in the file then.
+
+167
+00:09:13,120 --> 00:09:16,720
+So here's our house file.
+
+168
+00:09:16,720 --> 00:09:21,440
+And like we've done before, let's go to the project
+
+169
+00:09:21,440 --> 00:09:26,360
+library, navigate to where the file is.
+
+170
+00:09:26,360 --> 00:09:28,160
+That's the file we just worked on there.
+
+171
+00:09:35,000 --> 00:09:36,280
+Import, double hung.
+
+172
+00:09:36,280 --> 00:09:36,760
+OK.
+
+173
+00:09:41,360 --> 00:09:45,360
+Set our default level, first floor.
+
+174
+00:09:47,880 --> 00:09:49,080
+Go to the window.
+
+175
+00:09:49,080 --> 00:09:50,560
+Make sure that's active.
+
+176
+00:09:50,599 --> 00:09:51,079
+Add.
+
+177
+00:09:55,000 --> 00:09:56,119
+OK.
+
+178
+00:09:56,119 --> 00:09:58,839
+So now the way it inserts, you can
+
+179
+00:09:58,839 --> 00:10:02,439
+tell we need to massage the geometry
+
+180
+00:10:02,439 --> 00:10:05,520
+relative to the origin.
+
+181
+00:10:05,520 --> 00:10:09,560
+So you can see the origin, wherever the origin is,
+
+182
+00:10:09,560 --> 00:10:14,000
+is going to be aligned to the surface of that wall.
+
+183
+00:10:14,000 --> 00:10:16,719
+So we actually have to flip things around.
+
+184
+00:10:16,760 --> 00:10:21,760
+Actually, we'll have to rotate the geometry 180,
+
+185
+00:10:21,760 --> 00:10:23,240
+it looks like.
+
+186
+00:10:23,240 --> 00:10:24,440
+So let's just start.
+
+187
+00:10:24,440 --> 00:10:27,920
+Let's isolate these two.
+
+188
+00:10:27,920 --> 00:10:30,920
+And we'll just start trying to massage this geometry here.
+
+189
+00:10:30,920 --> 00:10:37,840
+So instead of tabbing into it here and rotating everything,
+
+190
+00:10:37,840 --> 00:10:43,520
+let's just instead use this edit mode.
+
+191
+00:10:43,560 --> 00:10:50,439
+And we'll put the 3D cursor there, select everything,
+
+192
+00:10:50,439 --> 00:11:00,079
+then rotate 180.
+
+193
+00:11:00,079 --> 00:11:04,920
+And I'm going to view it in wireframe.
+
+194
+00:11:04,920 --> 00:11:11,360
+And I'm going to put the cursor there and tab out of it.
+
+195
+00:11:11,400 --> 00:11:14,800
+And go to set origin to 3D cursor.
+
+196
+00:11:28,360 --> 00:11:34,320
+I'm going to turn on the effect only origins.
+
+197
+00:11:34,320 --> 00:11:37,040
+I'm going to move it to this edge.
+
+198
+00:11:37,040 --> 00:11:38,480
+And then I'm going to move it back.
+
+199
+00:11:38,480 --> 00:11:45,120
+Negative 0.5 inches.
+
+200
+00:11:45,120 --> 00:11:52,400
+And then don't forget to menu save representation
+
+201
+00:11:52,400 --> 00:11:55,520
+so that origin stays put.
+
+202
+00:11:55,520 --> 00:12:00,800
+So it looks like we're good with that.
+
+203
+00:12:00,800 --> 00:12:05,320
+So let's try to place a window again and see what happens.
+
+204
+00:12:05,320 --> 00:12:07,640
+See if it's a better placement.
+
+205
+00:12:07,680 --> 00:12:09,560
+All right, our placement is better.
+
+206
+00:12:09,560 --> 00:12:11,720
+That's good.
+
+207
+00:12:11,720 --> 00:12:17,480
+But now we need to adjust our opening there.
+
+208
+00:12:17,480 --> 00:12:25,840
+So we'll do Alt-O, see the opening in wireframe.
+
+209
+00:12:30,319 --> 00:12:34,360
+Select the opening tab into it till you get the outline.
+
+210
+00:12:37,640 --> 00:12:43,040
+That's the, and then just move it into place.
+
+211
+00:12:43,040 --> 00:12:58,960
+I believe that's the tab out of it.
+
+212
+00:12:58,960 --> 00:13:08,480
+Alt-O, close openings and see what it looks like.
+
+213
+00:13:08,480 --> 00:13:11,560
+All right, I can delete this one.
+
+214
+00:13:11,560 --> 00:13:13,200
+All right, well, that looks good.
+
+215
+00:13:13,200 --> 00:13:18,160
+Let's try to just place one to see if it looks good again.
+
+216
+00:13:18,160 --> 00:13:20,160
+There we go.
+
+217
+00:13:20,160 --> 00:13:22,080
+Yes, that is a lot of work.
+
+218
+00:13:22,080 --> 00:13:25,440
+But once it's done, we can make additional types out
+
+219
+00:13:25,440 --> 00:13:26,840
+of this a lot easier.
+
+220
+00:13:26,840 --> 00:13:29,400
+And I can show you on the next video.
+
diff --git a/104000_20250408_1311 - A workaround with geometry based types/104000_20250408_1311 - A workaround with geometry based types.srt b/104000_20250408_1311 - A workaround with geometry based types/104000_20250408_1311 - A workaround with geometry based types.srt
new file mode 100644
index 0000000..b750760
--- /dev/null
+++ b/104000_20250408_1311 - A workaround with geometry based types/104000_20250408_1311 - A workaround with geometry based types.srt
@@ -0,0 +1,132 @@
+1
+00:00:00,000 --> 00:00:11,220
+So in the last video we took some time to create this window type here. So to kind of a rehash we created some styles. We apply the styles to materials here.
+
+2
+00:00:12,340 --> 00:00:24,580
+And then we created this constituent set material constituent set and apply the materials which have those styles associated with them. And then we apply those materials essentially
+
+3
+00:00:25,580 --> 00:00:30,459
+to these individual geometry items or representation items they're called.
+
+4
+00:00:32,460 --> 00:00:33,540
+Unfortunately,
+
+5
+00:00:34,980 --> 00:00:35,660
+when
+
+6
+00:00:36,900 --> 00:00:41,060
+we want to, let's say we want to change the width or the height of this window.
+
+7
+00:00:42,980 --> 00:00:46,820
+Currently, if we want to keep all those assignments in place
+
+8
+00:00:46,820 --> 00:00:49,540
+we would have to change the width of each of these.
+
+9
+00:00:51,540 --> 00:00:57,540
+And if we tab into each one of these geometries, we'd have to individually change
+
+10
+00:00:58,540 --> 00:00:59,620
+each one of these.
+
+11
+00:01:00,620 --> 00:01:04,780
+To change the overall, you know, size of that window type.
+
+12
+00:01:05,780 --> 00:01:06,820
+As you can see,
+
+13
+00:01:07,820 --> 00:01:10,260
+that would be quite laborious to do.
+
+14
+00:01:11,740 --> 00:01:12,220
+So,
+
+15
+00:01:12,220 --> 00:01:16,940
+the way I do it is kind of hack is I enter the edit mode this way.
+
+16
+00:01:19,220 --> 00:01:23,420
+And select all the geometry and move everything at once.
+
+17
+00:01:25,220 --> 00:01:37,300
+However, there's a big problem with that is that when I exit out of this mode, you'll see that currently there's 22 items here found. If I exit out of that mode, it
+
+18
+00:01:38,300 --> 00:01:50,899
+concentrates it down to three items now. So if I refresh this. So now there's only three items in there versus 22 that was there before.
+
+19
+00:01:52,780 --> 00:01:56,780
+That is unfortunately a glitch that
+
+20
+00:01:56,780 --> 00:01:57,100
+That
+
+21
+00:01:58,940 --> 00:02:12,780
+We need to work around at this point and the how it consolidates it down. It's essentially consolidates all the geometry down to how the materials were assigned.
+
+22
+00:02:13,780 --> 00:02:20,780
+So in this case, well it's now styles that are assigned to it. So if you can see will click on each item here.
+
+23
+00:02:21,780 --> 00:02:35,780
+The glazing styles applied to that geometry, the color whites applied to that and the color dark. So now in this scenario, the style is applied directly to the geometry versus through the material.
+
+24
+00:02:36,780 --> 00:02:39,780
+In the future, I'm sure it won't work that way but
+
+25
+00:02:40,780 --> 00:02:53,780
+The way open source software is that's just the way it works. You can ultimately if you're fine with having to modify all those individual geometries those 22 items each it it's
+
+26
+00:02:55,780 --> 00:03:01,780
+Individually, then you can do that. But for me, it's not worth it. I'd rather be able to
+
+27
+00:03:01,780 --> 00:03:13,780
+Modify the geometry altogether. And so I just deal with this little glitch. In the meantime, you still have this your constituents that you're still those materials.
+
+28
+00:03:14,780 --> 00:03:30,780
+Which you can use intelligent tags to pull you know material names out of everything. But these materials here are not necessarily intelligently connected anymore to the various items there. So unfortunately, that's just a glitch.
+
+29
+00:03:31,780 --> 00:03:36,780
+That we're going to deal with. And so ultimately back in the model then
+
+30
+00:03:38,780 --> 00:03:46,780
+All these windows here I've created kind of new window types and different sizes and I pulled some of these windows in from that OD
+
+31
+00:03:48,780 --> 00:03:49,780
+Bonsai template.
+
+32
+00:03:51,780 --> 00:03:53,780
+So all of these types here.
+
+33
+00:03:53,780 --> 00:04:08,780
+I go to materials are consolidated down to those, you know, three items there as you can see. So again, unfortunately it's a glitch. But if you know how to work with it. It's tolerable.
+
diff --git a/105000_20250408_1443 - A workaround when duplicating a type with a void/105000_20250408_1443 - A workaround when duplicating a type with a void.srt b/105000_20250408_1443 - A workaround when duplicating a type with a void/105000_20250408_1443 - A workaround when duplicating a type with a void.srt
new file mode 100644
index 0000000..c48295c
--- /dev/null
+++ b/105000_20250408_1443 - A workaround when duplicating a type with a void/105000_20250408_1443 - A workaround when duplicating a type with a void.srt
@@ -0,0 +1,176 @@
+1
+00:00:00,000 --> 00:00:06,000
+So this is the window type we've been working on in the last couple videos here.
+
+2
+00:00:06,000 --> 00:00:14,000
+If I select this one and isolate this wall here and toggle the openings, ALT O,
+
+3
+00:00:14,000 --> 00:00:24,000
+you'll see with this window type here that I pulled in from the template that it has a void that's a unique shape.
+
+4
+00:00:24,000 --> 00:00:29,000
+It's not just a simple extrusion, it actually steps down.
+
+5
+00:00:29,000 --> 00:00:39,000
+The reason why is that this particular window type doesn't have any actual interior trim, it's just drywall returns.
+
+6
+00:00:39,000 --> 00:00:47,000
+So this step void type shape allows for that to be rendered more accurately.
+
+7
+00:00:47,000 --> 00:00:51,000
+I want to show you how to do that if you'd like to do that.
+
+8
+00:00:51,000 --> 00:01:00,000
+In this type that we worked on, you can select the void here and go to the Materials tab.
+
+9
+00:01:00,000 --> 00:01:03,000
+You can see that it is a swept solid right now.
+
+10
+00:01:03,000 --> 00:01:08,000
+If we tab into it, we can change the profile like we've done before.
+
+11
+00:01:08,000 --> 00:01:16,000
+In order to make a shape like that, you have to convert this shape from a swept solid to a tessellation.
+
+12
+00:01:16,000 --> 00:01:21,000
+To do that, you would do that here, convert to tessellation.
+
+13
+00:01:21,000 --> 00:01:29,000
+Now you can modify the mesh.
+
+14
+00:01:29,000 --> 00:01:36,000
+We can type E for inset here and let's do an extrusion.
+
+15
+00:01:36,000 --> 00:01:46,000
+I'm going to adjust these then.
+
+16
+00:01:46,000 --> 00:01:51,000
+I'm not going to totally measure accurately, but you get the idea.
+
+17
+00:01:51,000 --> 00:01:56,000
+It's just a different type of shape there.
+
+18
+00:01:56,000 --> 00:02:04,000
+I can just tab out of it, ALT O to close those, and go back to the rendered view.
+
+19
+00:02:04,000 --> 00:02:13,000
+If I hide this, you can see what shape the void carves out of the wall.
+
+20
+00:02:13,000 --> 00:02:18,000
+Similarly, this one here, if we hide that, does the same thing.
+
+21
+00:02:18,000 --> 00:02:25,000
+I'm going to undo those windows.
+
+22
+00:02:26,000 --> 00:02:34,000
+If we duplicate this instance over say five feet and then duplicate its type.
+
+23
+00:02:34,000 --> 00:02:37,000
+Select the type and I'm going to duplicate it.
+
+24
+00:02:37,000 --> 00:02:42,000
+Then change that instance to the new type we just made.
+
+25
+00:02:42,000 --> 00:02:47,000
+We apply it to the wall.
+
+26
+00:02:47,000 --> 00:02:57,000
+You'll see, unfortunately, the void, if I turn on the voids, resets itself back to that extrusion.
+
+27
+00:02:57,000 --> 00:02:59,000
+It's a swept solid.
+
+28
+00:02:59,000 --> 00:03:03,000
+It used to be this custom tessellation shape we made.
+
+29
+00:03:03,000 --> 00:03:10,000
+We created this new type and the void reset itself back, unfortunately, to an extrusion.
+
+30
+00:03:10,000 --> 00:03:15,000
+That's just another one of these glitches in Bonsai that we have to deal with.
+
+31
+00:03:15,000 --> 00:03:21,000
+In that instance, what I like to do is use the void from the previous type.
+
+32
+00:03:21,000 --> 00:03:23,000
+I just duplicated it.
+
+33
+00:03:23,000 --> 00:03:29,000
+Then I move it over. I'm going to move it over ten feet.
+
+34
+00:03:29,000 --> 00:03:35,000
+I'm going to select that void and I'm going to convert it to tessellation because it's an extrusion right now.
+
+35
+00:03:35,000 --> 00:03:44,000
+Then I'm going to select that void and then that last and I'm going to join them.
+
+36
+00:03:44,000 --> 00:03:47,000
+I'm going to manually save representation.
+
+37
+00:03:47,000 --> 00:03:53,000
+Then I'm going to cycle on and off the openings.
+
+38
+00:03:53,000 --> 00:03:58,000
+Those two voids are basically one now.
+
+39
+00:03:58,000 --> 00:04:01,000
+I'm going to tab into it.
+
+40
+00:04:01,000 --> 00:04:06,000
+I'm going to select this, control L, all the vertices and just delete them.
+
+41
+00:04:06,000 --> 00:04:14,000
+I'm going to take these and move them back to five feet which is aligned perfectly with the window.
+
+42
+00:04:14,000 --> 00:04:19,000
+Then tab out and close the openings.
+
+43
+00:04:19,000 --> 00:04:23,000
+There we have the void that makes sense again.
+
+44
+00:04:23,000 --> 00:04:30,000
+A little work around but it's handy if you know it exists.
+
diff --git a/106000_20250408_1526 - Modifying the size of a geometry based type/106000_20250408_1526 - Modifying the size of a geometry based type.srt b/106000_20250408_1526 - Modifying the size of a geometry based type/106000_20250408_1526 - Modifying the size of a geometry based type.srt
new file mode 100644
index 0000000..3ddb667
--- /dev/null
+++ b/106000_20250408_1526 - Modifying the size of a geometry based type/106000_20250408_1526 - Modifying the size of a geometry based type.srt
@@ -0,0 +1,76 @@
+1
+00:00:00,000 --> 00:00:05,440
+So if you remember in the last video we created this new type which we then
+
+2
+00:00:05,440 --> 00:00:17,200
+copied the void from this one over here. So if we want to change the size of this
+
+3
+00:00:17,200 --> 00:00:27,440
+type here we can like I had mentioned in previous videos select it and enter the
+
+4
+00:00:27,440 --> 00:00:34,280
+edit mode in this way versus tabbing into it. That way you can move all the
+
+5
+00:00:34,280 --> 00:00:41,760
+geometry items at the same time. So for example we want to move this say six
+
+6
+00:00:41,760 --> 00:00:56,080
+inches point five inward. Move this one say point five down to five down. And let's
+
+7
+00:00:56,120 --> 00:01:07,320
+actually just isolate this geometry itself and switch this to bounding box
+
+8
+00:01:07,320 --> 00:01:10,320
+and pick the center there.
+
+9
+00:01:10,320 --> 00:01:17,720
+Center there. Center there.
+
+10
+00:01:21,280 --> 00:01:30,479
+This to the center. There you go. Tab out of it. So when you modify the geometry of
+
+11
+00:01:30,479 --> 00:01:37,080
+like a door or a window I suggest doing it away from the origin so you can see
+
+12
+00:01:37,120 --> 00:01:45,400
+that the origin is here and we had moved this edge and this edge. If you modify
+
+13
+00:01:45,400 --> 00:01:51,400
+the edge that kind of the origin is on it might cause problems with where your
+
+14
+00:01:51,400 --> 00:01:58,080
+void is in relation to the origin and some other glitches as well. So I just
+
+15
+00:01:58,080 --> 00:02:04,360
+recommend if you're changing the size of a type that you do it away from the
+
+16
+00:02:04,360 --> 00:02:10,360
+origin you kind of keep the origin relative to the geometry. So after doing
+
+17
+00:02:10,360 --> 00:02:20,720
+that of course then you have to go in and change your voids as well. So we can
+
+18
+00:02:20,720 --> 00:02:36,520
+isolate that one. What did we do? We did point five down and point five that way.
+
+19
+00:02:37,320 --> 00:02:47,200
+And isolate and toggle openings. There's your new type with the new size.
+
diff --git a/107000_20250411_1149 - Modeling in 2nd floor structure/107000_20250411_1149 - Modeling in 2nd floor structure.srt b/107000_20250411_1149 - Modeling in 2nd floor structure/107000_20250411_1149 - Modeling in 2nd floor structure.srt
new file mode 100644
index 0000000..c67bc1f
--- /dev/null
+++ b/107000_20250411_1149 - Modeling in 2nd floor structure/107000_20250411_1149 - Modeling in 2nd floor structure.srt
@@ -0,0 +1,392 @@
+1
+00:00:00,000 --> 00:00:04,400
+So I'm going to start modeling in the second floor structure here.
+
+2
+00:00:04,400 --> 00:00:09,920
+I'm going to pull in some beam types from that OD template library.
+
+3
+00:00:09,920 --> 00:00:23,560
+Go to project library, multi-template, and I go to beams.
+
+4
+00:00:23,560 --> 00:00:34,120
+I want to pull in this one and this one, 2x10, and then a double or sister 2x10 there.
+
+5
+00:00:34,120 --> 00:00:42,920
+Select those wall types and I'm going to isolate it to make it easier to model.
+
+6
+00:00:42,920 --> 00:00:50,879
+And switch to beam and go to make that one active and add it.
+
+7
+00:00:50,880 --> 00:00:56,280
+I'm going to turn off some snaps first here.
+
+8
+00:00:56,280 --> 00:01:03,840
+And add it in the world.
+
+9
+00:01:03,840 --> 00:01:07,200
+There and there.
+
+10
+00:01:07,200 --> 00:01:08,200
+Turn.
+
+11
+00:01:08,200 --> 00:01:16,200
+Then I'm just going to rotate this, duplicate it, and rotate it 90.
+
+12
+00:01:16,200 --> 00:01:22,480
+And I'm going to switch this to a 2x10.
+
+13
+00:01:22,480 --> 00:01:29,500
+So I'm going to model this second floor structure and then I'll get back to you then after that.
+
+14
+00:01:29,500 --> 00:01:34,520
+So off camera I created these two floor assemblies here.
+
+15
+00:01:34,520 --> 00:01:38,040
+Created a new slab type.
+
+16
+00:01:38,040 --> 00:01:42,840
+We're using the T111 for that floor sheathing.
+
+17
+00:01:42,840 --> 00:01:46,720
+You can see the beams there.
+
+18
+00:01:46,720 --> 00:01:53,840
+I also off camera created some new styles and some materials.
+
+19
+00:01:53,840 --> 00:02:00,400
+Created this wood 4 inch groove style and this wood lumber white.
+
+20
+00:02:00,400 --> 00:02:07,560
+And then two new materials, this T111 sheathing and then also lumber painted and I applied
+
+21
+00:02:07,560 --> 00:02:10,640
+those styles to that.
+
+22
+00:02:10,639 --> 00:02:17,239
+These assemblies are also linked to aggregates too.
+
+23
+00:02:17,239 --> 00:02:22,739
+I select both of those.
+
+24
+00:02:22,739 --> 00:02:32,359
+So let's import in some columns now and some additional beams.
+
+25
+00:02:32,360 --> 00:02:45,240
+So go to your project library and we're going from that OD Bonsai template and we want to
+
+26
+00:02:45,240 --> 00:02:49,200
+import in some columns.
+
+27
+00:02:49,200 --> 00:02:56,360
+I'm going to import these, the built up columns.
+
+28
+00:02:56,360 --> 00:03:04,440
+And let's import that one, that's steel.
+
+29
+00:03:04,440 --> 00:03:06,440
+And go to beams.
+
+30
+00:03:06,440 --> 00:03:12,160
+Then we'll import an LVL, a sistered LVL.
+
+31
+00:03:12,160 --> 00:03:18,280
+We'll import these just to have them in the file as well.
+
+32
+00:03:18,280 --> 00:03:24,920
+So I am off camera going to model in a beam here that will catch this floor system and
+
+33
+00:03:24,920 --> 00:03:27,480
+then I'll put some columns in there as well.
+
+34
+00:03:27,480 --> 00:03:31,359
+So I'll get back to you after I do that.
+
+35
+00:03:31,359 --> 00:03:33,480
+So I added in those columns and beams.
+
+36
+00:03:33,480 --> 00:03:36,000
+I can show you.
+
+37
+00:03:36,000 --> 00:03:41,040
+Isolate them.
+
+38
+00:03:41,040 --> 00:03:46,079
+You can trim these columns to that beam.
+
+39
+00:03:46,079 --> 00:03:49,600
+Select the two columns first and then the beam.
+
+40
+00:03:49,600 --> 00:03:55,000
+And then do shift E and it trims those columns to that beam.
+
+41
+00:03:55,000 --> 00:04:04,200
+You can do it the same here.
+
+42
+00:04:04,200 --> 00:04:08,459
+And lastly we're going to model in a second floor truss.
+
+43
+00:04:08,459 --> 00:04:14,560
+So to start that, go back to our template file.
+
+44
+00:04:14,560 --> 00:04:20,600
+Load that.
+
+45
+00:04:20,600 --> 00:04:24,400
+And I'm going to bring in a beam.
+
+46
+00:04:24,400 --> 00:04:29,520
+We'll do 2x4, 2x6, 2x8.
+
+47
+00:04:29,520 --> 00:04:36,040
+Probably going to need all these eventually so I'm just going to bring those all in.
+
+48
+00:04:36,040 --> 00:04:41,480
+Ok.
+
+49
+00:04:41,480 --> 00:04:49,240
+And then model out the beam.
+
+50
+00:04:49,240 --> 00:04:54,400
+Start with the 2x4 there.
+
+51
+00:04:54,400 --> 00:04:57,680
+Add it somewhere in space.
+
+52
+00:04:57,680 --> 00:05:03,600
+Move it up here.
+
+53
+00:05:03,600 --> 00:05:13,320
+So because this 2x4 will be part of a wood floor truss, we're going to change its designation
+
+54
+00:05:13,320 --> 00:05:17,040
+to an IFC member, not IFC beam.
+
+55
+00:05:17,040 --> 00:05:22,520
+So before we do that I'm going to just duplicate it.
+
+56
+00:05:22,520 --> 00:05:24,520
+Duplicate.
+
+57
+00:05:24,520 --> 00:05:33,799
+Just a copy.
+
+58
+00:05:33,799 --> 00:05:36,799
+Rename it 2x4.
+
+59
+00:05:36,799 --> 00:05:42,719
+Just say member.
+
+60
+00:05:42,719 --> 00:05:51,320
+And then we're going to change the instance to a member.
+
+61
+00:05:51,320 --> 00:05:52,320
+It should.
+
+62
+00:05:52,320 --> 00:05:54,880
+Is there a truss?
+
+63
+00:05:54,880 --> 00:06:02,360
+I will just keep it not defined for now.
+
+64
+00:06:02,360 --> 00:06:04,280
+And say assign.
+
+65
+00:06:04,280 --> 00:06:09,880
+So it both changes the instance but also the type changes as well.
+
+66
+00:06:09,880 --> 00:06:13,080
+See I have member type as well there.
+
+67
+00:06:13,080 --> 00:06:20,800
+So I'm going to start with this and model out a truss then and I will get back to you.
+
+68
+00:06:20,800 --> 00:06:24,640
+So I created a floor truss here with those IFC members.
+
+69
+00:06:24,640 --> 00:06:33,680
+I used Shift-E to extend this web profile to this top cord here.
+
+70
+00:06:33,680 --> 00:06:43,120
+So for example I could move that top cord and do a Shift-G. And those members would
+
+71
+00:06:43,120 --> 00:06:48,540
+mend themselves to that new height.
+
+72
+00:06:48,540 --> 00:06:51,020
+So let's create a linked aggregate out of this.
+
+73
+00:06:51,020 --> 00:06:54,540
+Just a refresher on how to do that.
+
+74
+00:06:54,540 --> 00:06:55,540
+Select all those members.
+
+75
+00:06:55,540 --> 00:07:03,020
+I'm going to place my origin there at the center.
+
+76
+00:07:03,020 --> 00:07:06,540
+And just going to create an aggregate to start.
+
+77
+00:07:06,540 --> 00:07:13,580
+Let's do floor truss.
+
+78
+00:07:13,580 --> 00:07:20,780
+And then I will pick any one of these members and do Shift-Control-D. You can see it copies
+
+79
+00:07:20,780 --> 00:07:21,780
+it.
+
+80
+00:07:21,780 --> 00:07:25,979
+I'm just going to move it two feet over.
+
+81
+00:07:25,979 --> 00:07:35,020
+So if you query it then you can see that those are two linked aggregates.
+
+82
+00:07:35,020 --> 00:07:37,060
+And you can do the same thing here again.
+
+83
+00:07:37,060 --> 00:07:46,020
+Shift-D and then move it two feet.
+
+84
+00:07:46,020 --> 00:07:50,140
+So I finished modeling the second floor structure.
+
+85
+00:07:50,140 --> 00:07:54,380
+These trusses as you remember are linked aggregates here.
+
+86
+00:07:54,380 --> 00:08:00,659
+And then I actually put each one of these aggregates in an overall aggregate called
+
+87
+00:08:00,659 --> 00:08:01,659
+Wood Truss Assembly.
+
+88
+00:08:01,660 --> 00:08:08,180
+You can select the whole thing that way.
+
+89
+00:08:08,180 --> 00:08:13,500
+And finally let's put these two members of this sheathing and this beam in this overall
+
+90
+00:08:13,500 --> 00:08:15,540
+wood floor assembly.
+
+91
+00:08:15,540 --> 00:08:17,900
+So I'll Shift-Select them.
+
+92
+00:08:17,900 --> 00:08:21,680
+There's one of two ways you can do it.
+
+93
+00:08:21,680 --> 00:08:29,160
+You can go here and type in the aggregate if you know it.
+
+94
+00:08:29,160 --> 00:08:31,380
+And then apply that.
+
+95
+00:08:31,380 --> 00:08:42,260
+Or you can pick the part that's within the overall aggregate.
+
+96
+00:08:42,260 --> 00:08:46,980
+So I'm just going to pick that floor truss, one of those, and say assign.
+
+97
+00:08:46,980 --> 00:08:56,820
+And then it should apply it to, there you go, if we can isolate it.
+
+98
+00:08:56,820 --> 00:09:00,820
+That's the overall aggregate then with all the members inside.
+
diff --git a/108000_20250414_1207 - Railings - parametric and arrayed/108000_20250414_1207 - Railings - parametric and arrayed.srt b/108000_20250414_1207 - Railings - parametric and arrayed/108000_20250414_1207 - Railings - parametric and arrayed.srt
new file mode 100644
index 0000000..a9812f9
--- /dev/null
+++ b/108000_20250414_1207 - Railings - parametric and arrayed/108000_20250414_1207 - Railings - parametric and arrayed.srt
@@ -0,0 +1,340 @@
+1
+00:00:00,000 --> 00:00:05,880
+So I modeled in quite a number of things since our last video here and I'll go
+
+2
+00:00:05,880 --> 00:00:12,800
+through them one by one. So these exterior walls I believe were in there
+
+3
+00:00:12,800 --> 00:00:19,360
+before so I'm just gonna select all the types and I'm gonna hide them and the
+
+4
+00:00:19,360 --> 00:00:22,880
+windows we had that in there so I'm gonna select all the windows and hide
+
+5
+00:00:22,880 --> 00:00:30,840
+them. So I modeled in the interior walls I brought some wall types in from that
+
+6
+00:00:30,840 --> 00:00:41,320
+OD template so I'm just gonna select the types those are 2x4 walls there select
+
+7
+00:00:41,320 --> 00:00:50,519
+these those are 2x6 walls hide those and these are furring walls 2x4
+
+8
+00:00:50,520 --> 00:00:53,960
+furring walls I'm just gonna hide those.
+
+9
+00:00:55,200 --> 00:01:06,480
+And let's as you can see I modeled in a new staircase here I took some time to
+
+10
+00:01:06,480 --> 00:01:13,240
+model that in so I basically replicated the same approach as the basement stair
+
+11
+00:01:13,240 --> 00:01:22,300
+so the stringers you know are made from intelligent stair representation type so
+
+12
+00:01:22,300 --> 00:01:28,520
+I'm just gonna select all those types and hide them. Then this trim board here
+
+13
+00:01:28,520 --> 00:01:37,759
+is just an IFC covering it's extrusion based family it's here's the extrusion
+
+14
+00:01:37,760 --> 00:01:51,720
+there I'm gonna select all those types and hide them. And that just an intelligent
+
+15
+00:01:51,720 --> 00:02:01,120
+stair representation as well hide that. These are just I modeled them as a mesh
+
+16
+00:02:01,120 --> 00:02:07,040
+we tab into it and see there's just individual meshes so that's kind of like
+
+17
+00:02:07,040 --> 00:02:17,840
+the basement stair as well. Hide that. And here I created a intelligent layered
+
+18
+00:02:17,840 --> 00:02:29,280
+type for the winder treads there select those and hide them. And then I brought
+
+19
+00:02:29,280 --> 00:02:39,760
+in various structural beam types here an LVL and like 2x4 lumber so just
+
+20
+00:02:39,760 --> 00:02:45,520
+brought those in from the template library so I'm gonna actually select all
+
+21
+00:02:45,520 --> 00:02:54,680
+the beams and hide them and the columns select all the columns and hide them.
+
+22
+00:02:54,680 --> 00:03:05,200
+Created a new type for the ceiling there.
+
+23
+00:03:07,120 --> 00:03:17,040
+Hide that. And then a new wall type for just gyp board only as you can see
+
+24
+00:03:17,040 --> 00:03:31,120
+there. Hide that. And select all the slabs hide those all the members hide those. So
+
+25
+00:03:31,120 --> 00:03:39,079
+yeah that's all the changes so far. So let's model in a intelligent parametric
+
+26
+00:03:39,080 --> 00:03:46,200
+railing on this stair here. Before I do that I'm gonna select the aggregate
+
+27
+00:03:46,200 --> 00:03:50,760
+which I put all these stair components in that aggregate there and then I'm
+
+28
+00:03:50,760 --> 00:04:02,040
+just isolate it. So the parametric railing is pretty simple it doesn't have
+
+29
+00:04:02,040 --> 00:04:06,720
+many bells and whistles but I kind of just want to show it to you just so you
+
+30
+00:04:06,720 --> 00:04:16,800
+know it's there. We're gonna do the type launcher create a new type first floor
+
+31
+00:04:18,160 --> 00:04:27,760
+stair railing and categorize it railing type.
+
+32
+00:04:28,400 --> 00:04:38,200
+Let's do guardrail and here it is a railing representation type so say okay
+
+33
+00:04:38,200 --> 00:04:47,920
+and set active and I'm gonna add it in world here.
+
+34
+00:04:47,920 --> 00:05:03,480
+So if you tab into it you can see it starts with a line with three vertices
+
+35
+00:05:03,480 --> 00:05:12,960
+there. If you subdivide increase the subdivision there you'll see that at
+
+36
+00:05:13,000 --> 00:05:19,000
+every vertices when I tab out it actually you know articulates or breaks
+
+37
+00:05:19,000 --> 00:05:28,200
+the railing. So that's one way to divide up the railing type and combine that
+
+38
+00:05:28,200 --> 00:05:35,919
+with then oops sorry go to railing here and these are the parameters you can
+
+39
+00:05:35,920 --> 00:05:44,080
+adjust as well for that the thickness I'll just do I don't know 1.5 inches and
+
+40
+00:05:44,080 --> 00:05:54,800
+then you adjust the spacing. There you go so there's two railing types it's the
+
+41
+00:05:54,800 --> 00:06:01,680
+frameless panel and then there's the wall mounted one which looks like that
+
+42
+00:06:01,680 --> 00:06:10,960
+but we'll do the frameless panel one and if you want to contour this then to
+
+43
+00:06:10,960 --> 00:06:20,400
+the stair I'm gonna select all these and I'm gonna mesh cleanup and we're gonna
+
+44
+00:06:20,400 --> 00:06:29,760
+limit dissolve so it's only two vertices now so let's change the location oops
+
+45
+00:06:29,840 --> 00:06:44,840
+didn't want to do that you know so we'll relocate that vertices a that corner at
+
+46
+00:06:44,840 --> 00:07:02,080
+the stair and the other one there I'm going to turn off my just do vertices
+
+47
+00:07:02,080 --> 00:07:15,400
+makes it a little easier there you go and then from here you can subdivide to
+
+48
+00:07:15,400 --> 00:07:23,640
+your heart's content if it maxes out at 10 there so let's say you can do 7 and
+
+49
+00:07:23,640 --> 00:07:32,159
+tab out of it and then if you want to do 14 you would subdivide again just you
+
+50
+00:07:32,159 --> 00:07:42,520
+know do one so there's the starting of a railing so I'm not going to use this
+
+51
+00:07:42,520 --> 00:07:47,400
+approach for the railing of this stair because it's pretty simple as you can
+
+52
+00:07:47,400 --> 00:07:53,000
+see I think our balusters balustrades are going to be a little more elaborate
+
+53
+00:07:53,000 --> 00:07:59,040
+so I'm going to model up just one type and then array it down through I can
+
+54
+00:07:59,040 --> 00:08:05,760
+show you how to do that next so I'm going to delete this railing type and
+
+55
+00:08:05,760 --> 00:08:12,200
+instead I modeled in an individual baluster here you can see that it's kind
+
+56
+00:08:12,200 --> 00:08:17,960
+of tapered basically just did it with a mesh started with the circle here and
+
+57
+00:08:18,159 --> 00:08:27,640
+then extruded it and then shrunk the circle down at the top so we want to
+
+58
+00:08:27,640 --> 00:08:38,039
+then convert that into a type so we can launch say balustrade and it's a railing
+
+59
+00:08:38,039 --> 00:08:48,199
+type when I go not defined this time it's your tessellation from object and
+
+60
+00:08:48,199 --> 00:08:53,199
+so yes that's the circle that's what we want or we can select it in world there
+
+61
+00:08:53,199 --> 00:09:02,599
+and say okay okay I'm gonna put my 3d sorry we're just gonna add it in world
+
+62
+00:09:02,600 --> 00:09:13,120
+I'm gonna pop it right there let's see what spatial I want to change it to
+
+63
+00:09:13,120 --> 00:09:25,400
+first right there all right so let's array this thing on a ray it and we're
+
+64
+00:09:25,400 --> 00:09:33,319
+gonna do distribution distribute and we're gonna put your 3d cursor right
+
+65
+00:09:33,319 --> 00:09:41,360
+there and we are gonna click this button which will take in consideration where
+
+66
+00:09:41,360 --> 00:09:49,720
+that 3d cursor is I'm just gonna say zero change there and I'm going to start
+
+67
+00:09:49,720 --> 00:10:01,840
+increasing that count and see what happens all right looks good so then we
+
+68
+00:10:01,840 --> 00:10:16,760
+can move it why let's do and then duplicate it we got two arrays now
+
+69
+00:10:19,720 --> 00:10:31,760
+four inches five inches five inches so yeah there's a start of our balusters
+
+70
+00:10:31,760 --> 00:10:39,160
+then so you can see these balusters step with the treads which we don't
+
+71
+00:10:39,160 --> 00:10:43,440
+necessarily want because when we put our hand railing in there we want to trim
+
+72
+00:10:43,440 --> 00:10:50,960
+these to the hand railing so let's do that before we do let's select all the
+
+73
+00:10:50,960 --> 00:10:58,720
+rays and apply them so they're no longer arrays and we want to create a new
+
+74
+00:10:58,720 --> 00:11:07,840
+aggregate I'll call it baluster aggregate and go up to add I see
+
+75
+00:11:07,840 --> 00:11:12,300
+element and we want to change this to I see feature element which has the I see
+
+76
+00:11:12,300 --> 00:11:20,819
+opening element which acts as a void object and we want to apply to the
+
+77
+00:11:20,819 --> 00:11:30,020
+aggregate that we just made and custom extrude yes and say okay
+
+78
+00:11:30,020 --> 00:11:45,579
+and it places the void in world we can select it tab into it and see which way
+
+79
+00:11:45,579 --> 00:11:51,620
+the direct extrusion direction is going and I'm gonna flip it to 90 in that
+
+80
+00:11:51,620 --> 00:12:02,540
+direction and tab into it again and select these individual vertices
+
+81
+00:12:05,820 --> 00:12:08,820
+text
+
+82
+00:12:08,820 --> 00:12:28,780
+out of it and let's move it up to a certain level spell right there make
+
+83
+00:12:28,780 --> 00:12:44,260
+sure engulfs the balusters there tab out of it and then do an alt o to close
+
+84
+00:12:44,260 --> 00:12:51,020
+the openings and hopefully the balusters will be trimmed then after that there we
+
+85
+00:12:51,020 --> 00:12:53,220
+go
+
diff --git a/109000_20250415_1325 - Representation contexts as it relates to a door/109000_20250415_1325 - Representation contexts as it relates to a door.srt b/109000_20250415_1325 - Representation contexts as it relates to a door/109000_20250415_1325 - Representation contexts as it relates to a door.srt
new file mode 100644
index 0000000..a0e1dce
--- /dev/null
+++ b/109000_20250415_1325 - Representation contexts as it relates to a door/109000_20250415_1325 - Representation contexts as it relates to a door.srt
@@ -0,0 +1,292 @@
+1
+00:00:00,000 --> 00:00:07,880
+So let's cover representation contexts. So this door type here is a door type that came standard with
+
+2
+00:00:08,760 --> 00:00:16,720
+demo library when we first created this project. And so if you go to your materials tab here under representations, you can see that there's two
+
+3
+00:00:17,600 --> 00:00:23,460
+representations. So one is the model body model view which we see here
+
+4
+00:00:23,720 --> 00:00:28,040
+and the other one is plan body plan view. And if I click on here, you'll see
+
+5
+00:00:28,480 --> 00:00:37,360
+it looks like that door swing. So that's the representation or what the geometry looks like when you're in plan
+
+6
+00:00:38,440 --> 00:00:41,720
+and in the plan view target view and
+
+7
+00:00:42,879 --> 00:00:45,239
+to go back to the three-dimensional model. So
+
+8
+00:00:45,760 --> 00:00:51,900
+this context is a little hard to describe so I kind of created this table here that
+
+9
+00:00:52,600 --> 00:00:54,920
+provides examples of the various
+
+10
+00:00:55,640 --> 00:01:01,880
+configurations of context type and context identifier target view. So the first one is the most common
+
+11
+00:01:02,120 --> 00:01:13,720
+or some model body model view and that's basically the full 3D shape of an object. For example, the 3D geometry of a door or window. So viewed in model.
+
+12
+00:01:14,360 --> 00:01:22,720
+Second one plan axis graph view. An example of that would be an axis, a simple linear axis of a wall or beam.
+
+13
+00:01:23,720 --> 00:01:29,480
+I'm actually not quite 100% sure what that context is for. That
+
+14
+00:01:30,400 --> 00:01:35,020
+context comes standard with the demo file, but I haven't found a use case for it yet.
+
+15
+00:01:35,560 --> 00:01:41,560
+So the fourth one the model box model view is the overall bounding box of three-dimensional geometry.
+
+16
+00:01:42,080 --> 00:01:43,720
+That
+
+17
+00:01:43,720 --> 00:01:49,480
+happens more times than not automatically behind the scenes. So you don't necessarily have to set that for anything.
+
+18
+00:01:49,480 --> 00:01:57,440
+Model annotation section view. An example would be, for example, up down aerials on window sashes.
+
+19
+00:01:59,360 --> 00:02:07,920
+Model annotation elevation view would be like a door swing indicator in elevation, kind of a triangle symbol, for example.
+
+20
+00:02:08,400 --> 00:02:14,840
+So model annotation model view would be text or symbols in orthographic perspective view.
+
+21
+00:02:15,840 --> 00:02:21,480
+And then model profile elevation view. This one's a special one where you could use a profile,
+
+22
+00:02:22,240 --> 00:02:28,640
+simple profile geometry to create a void for a door or window instead of actually
+
+23
+00:02:29,220 --> 00:02:31,680
+using a void or an IFC opening element.
+
+24
+00:02:32,600 --> 00:02:40,760
+So plan annotation plan view are just, that's mostly the texts and symbols that you see on floor plans.
+
+25
+00:02:41,760 --> 00:02:44,760
+And again, I'm not quite sure what that context is for.
+
+26
+00:02:45,280 --> 00:02:51,040
+Then plan annotation reflected view is just text and symbols on reflected ceiling plan.
+
+27
+00:02:52,399 --> 00:02:54,399
+And finally plan body plan view.
+
+28
+00:02:54,920 --> 00:03:01,519
+That could be like a door swing or an arc in plan, which we just saw. And again, I'm not quite sure there.
+
+29
+00:03:04,760 --> 00:03:08,280
+So again that door type has these two contexts in it.
+
+30
+00:03:09,000 --> 00:03:10,120
+So let's say for example,
+
+31
+00:03:10,120 --> 00:03:15,080
+we created a new door type here and it only has model body model view.
+
+32
+00:03:15,080 --> 00:03:19,000
+And we want to create a plan body plan view on this.
+
+33
+00:03:19,640 --> 00:03:27,200
+So to do that, you go plan body plan view and then click on the plus and it'll ask you,
+
+34
+00:03:27,600 --> 00:03:29,600
+do you want to
+
+35
+00:03:30,600 --> 00:03:34,160
+repeat basically the full representation of full geometry?
+
+36
+00:03:35,040 --> 00:03:37,200
+Or do you want to just do a simple cube?
+
+37
+00:03:37,200 --> 00:03:43,519
+Or you can say from an object, you can click another object, a vanilla blender object in world.
+
+38
+00:03:44,840 --> 00:03:47,880
+Or just the bounding box or the trace outline.
+
+39
+00:03:47,880 --> 00:03:50,600
+Let's do a trace outline just to see what it does.
+
+40
+00:03:51,920 --> 00:03:58,720
+So here you can see that it basically flattened that three dimensional geometry down to
+
+41
+00:04:00,320 --> 00:04:02,680
+that geometry there.
+
+42
+00:04:03,520 --> 00:04:10,440
+So that's not totally representative of what the door arc should look like.
+
+43
+00:04:10,440 --> 00:04:13,720
+So I'm going to take another stab at it. I'm going to delete that.
+
+44
+00:04:15,640 --> 00:04:21,560
+And I'm going to duplicate model body model view.
+
+45
+00:04:21,560 --> 00:04:25,800
+Let's create another one. I'm going to do full representation, full representation.
+
+46
+00:04:27,200 --> 00:04:29,040
+And just going to flip there.
+
+47
+00:04:30,040 --> 00:04:34,040
+And I'm going to tab interaction, not tab in, I'm going to edit mode here.
+
+48
+00:04:35,160 --> 00:04:42,040
+And I'm going to select all this and delete the faces and tab out.
+
+49
+00:04:43,160 --> 00:04:47,640
+So we got the original one and the one we just made.
+
+50
+00:04:48,160 --> 00:04:54,120
+So now I'm going to go to plan body plan view from that add.
+
+51
+00:04:54,120 --> 00:04:56,040
+I'm going to do trace outline.
+
+52
+00:04:57,240 --> 00:04:58,760
+So this gives us a better start.
+
+53
+00:04:59,640 --> 00:05:06,680
+On that symbol, so I'm actually just going to delete this one we just made.
+
+54
+00:05:07,680 --> 00:05:11,520
+I go to here. So go into edit mode.
+
+55
+00:05:14,800 --> 00:05:16,840
+And we can just do the kind of the.
+
+56
+00:05:20,960 --> 00:05:25,400
+Do this one, this one, put our 3D cursor here.
+
+57
+00:05:26,600 --> 00:05:27,960
+I'm going to duplicate it.
+
+58
+00:05:29,360 --> 00:05:30,920
+And rotate it 90.
+
+59
+00:05:35,840 --> 00:05:38,720
+And we can add a circle.
+
+60
+00:05:40,720 --> 00:05:43,320
+And we're going to do three feet.
+
+61
+00:05:47,720 --> 00:05:50,800
+Select that edge, delete edge.
+
+62
+00:05:52,120 --> 00:05:56,120
+Delete that edge, control L, select all those edges and delete them.
+
+63
+00:05:57,120 --> 00:06:01,080
+And I'm going to delete that edge, that edge.
+
+64
+00:06:02,720 --> 00:06:08,160
+And I believe I can tab out then flip between these representations, then
+
+65
+00:06:09,240 --> 00:06:15,240
+you can see then we created a geometry for the plan body plan view or
+
+66
+00:06:16,160 --> 00:06:20,040
+essentially what this geometry will look like in a floor plan.
+
+67
+00:06:20,040 --> 00:06:27,120
+I don't necessarily like to do my door swings like this.
+
+68
+00:06:27,120 --> 00:06:37,600
+In the OD Bonsai template, you'll see if you investigate the different representation types.
+
+69
+00:06:37,600 --> 00:06:46,680
+I like to do my swing and actually in 3D and my door trim and jam and everything else in 3D as well.
+
+70
+00:06:47,280 --> 00:06:55,320
+Reason being is that when you do your drawings, it actually will cut through that geometry.
+
+71
+00:06:55,320 --> 00:07:02,760
+And the cut line is a thicker line in the drawings than than if it was just a flat in 2D line work like that.
+
+72
+00:07:03,240 --> 00:07:09,120
+So going forward, you'll see these doors that I pull in have this view instead.
+
+73
+00:07:10,080 --> 00:07:11,280
+It's just a preference.
+
diff --git a/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata.srt b/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata.srt
new file mode 100644
index 0000000..f52cf0c
--- /dev/null
+++ b/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata.srt
@@ -0,0 +1,156 @@
+1
+00:00:00,000 --> 00:00:06,120
+So if you remember in a video a while back we created reference planes for
+
+2
+00:00:06,120 --> 00:00:15,540
+both in plan and in section. So I can turn those on to show you. Shift select.
+
+3
+00:00:15,540 --> 00:00:29,700
+So these I'm going 3D. So these elements here. Let's say you're in a floor plan
+
+4
+00:00:29,700 --> 00:00:37,140
+view and you'd like to still see these reference planes here while you work in
+
+5
+00:00:37,140 --> 00:00:43,019
+bonsai but when you print them out you don't want them to show. I can show you a
+
+6
+00:00:43,019 --> 00:00:51,500
+way to do that. So let's say in this view we want to keep these reference planes
+
+7
+00:00:51,500 --> 00:00:57,620
+on which are have an object type a predefined type for reference plan and
+
+8
+00:00:57,779 --> 00:01:08,420
+then turn off the reference section there. So if you remember if we go back to our drawing,
+
+9
+00:01:08,420 --> 00:01:15,420
+we click our drawing and go to parameters here. Actually I'm going to take that back.
+
+10
+00:01:15,420 --> 00:01:20,060
+I'm going to go into drawing here and we're going to go to element filters.
+
+11
+00:01:20,060 --> 00:01:30,540
+You'll see that we turned off all IFC virtual elements but let's say we want to now be a little
+
+12
+00:01:30,540 --> 00:01:41,060
+more selective and just turn off these the reference sections. So a quick way to adjust
+
+13
+00:01:41,060 --> 00:01:49,540
+this filter here is to say select the thing that we don't want in the view and go here to object
+
+14
+00:01:49,540 --> 00:01:56,540
+type and click on that value and you see down here it says object type that string there was
+
+15
+00:01:56,540 --> 00:02:03,060
+copied into your clipboard. You can go back to your drawings and you actually copy that string
+
+16
+00:02:03,060 --> 00:02:19,540
+into that filter there and say save filter. Then go back to your drawing and activate the drawing
+
+17
+00:02:19,540 --> 00:02:30,300
+again and see if it turns off the reference plane and activate the drawing again and see if it turns
+
+18
+00:02:30,340 --> 00:02:44,860
+off the reference plane. There it did. Great. So we can then save that filter back in our
+
+19
+00:02:44,860 --> 00:02:55,420
+we can save plan because that's what it was called before so it'll overwrite the save search
+
+20
+00:02:55,420 --> 00:03:03,820
+essentially. So from here then we can print to see what we're dealing with.
+
+21
+00:03:03,820 --> 00:03:21,739
+If we zoom into that line there right click and inspect I just want to see what classes are
+
+22
+00:03:21,740 --> 00:03:28,020
+associated with that. I'm going to go up a group here so we only have IFC virtual element and
+
+23
+00:03:28,020 --> 00:03:38,180
+material null so it doesn't have the predefined information associated with it. So let us go back
+
+24
+00:03:38,180 --> 00:03:52,020
+click on the drawing go to the properties of that drawing and we want to tell it in metadata
+
+25
+00:03:52,020 --> 00:03:59,940
+this is kind of a summary of a couple videos ago we want to tell it to export out the predefined
+
+26
+00:03:59,940 --> 00:04:10,380
+type and again go back to our selector syntax here and we want to find what's appropriate for
+
+27
+00:04:10,380 --> 00:04:22,019
+exporting out the predefined type so copy that and in metadata I want to say okay so now run
+
+28
+00:04:22,019 --> 00:04:39,580
+the drawing and then go and inspect again our line so now you can see we got the predefined
+
+29
+00:04:39,580 --> 00:04:51,419
+type exported out as a class and so to test this out period in the class and then stroke none
+
+30
+00:04:51,419 --> 00:05:03,380
+actually I'm going to turn my caps off stroke none and there you see it turns it off if I see
+
+31
+00:05:03,580 --> 00:05:11,500
+on and off there even though it turns off the line you see that there's a rasterized line
+
+32
+00:05:11,500 --> 00:05:22,300
+there still which I'll show you how to turn off so we ultimately want to save this rule in our
+
+33
+00:05:22,300 --> 00:05:37,100
+default CSS if you remember and I'll just paste it here and save so the way to turn off the raster
+
+34
+00:05:37,100 --> 00:05:46,540
+line is you go up here and you would think turn off the wireframe all together but actually that
+
+35
+00:05:46,540 --> 00:05:57,220
+doesn't work if you turn the opacity down and then if you remember going to our overlays or
+
+36
+00:05:57,220 --> 00:06:03,340
+underlay sorry this is using the blender default the current shading style there I'm going to
+
+37
+00:06:03,340 --> 00:06:13,060
+select that I want to save that drawing style so it remembers it let's save now hopefully when we
+
+38
+00:06:13,060 --> 00:06:30,780
+run our drawing there we go so those reference planes are all turned off in the actual SVG but
+
+39
+00:06:30,780 --> 00:06:39,380
+they still show up when you're using bonsai which is useful during while you're modeling things
+
diff --git a/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors.srt b/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors.srt
new file mode 100644
index 0000000..d55365f
--- /dev/null
+++ b/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors.srt
@@ -0,0 +1,136 @@
+1
+00:00:00,000 --> 00:00:07,440
+So you'll notice our model is getting pretty elaborate over the last couple of videos.
+
+2
+00:00:07,440 --> 00:00:22,400
+So when you're switching drawings now, it does take some time.
+
+3
+00:00:22,400 --> 00:00:27,020
+So that can be annoying when you're kind of just want to flip through the various drawings
+
+4
+00:00:27,020 --> 00:00:29,900
+really quick when you're modeling something.
+
+5
+00:00:29,900 --> 00:00:37,460
+So a little tip, let's turn the line weights on again.
+
+6
+00:00:37,460 --> 00:00:45,220
+If you want to quickly open up a drawing view without it really taking a lot of time, you
+
+7
+00:00:45,220 --> 00:00:49,500
+can shift select and click on that button.
+
+8
+00:00:49,500 --> 00:00:52,800
+And it quickly goes to that view.
+
+9
+00:00:52,800 --> 00:01:00,680
+It doesn't turn on the annotation, as you can see, but it's a quick way to navigate
+
+10
+00:01:00,680 --> 00:01:05,720
+through the model if you're just modeling.
+
+11
+00:01:05,720 --> 00:01:09,960
+So a little tip for you.
+
+12
+00:01:09,960 --> 00:01:11,920
+So let's recreate this door here.
+
+13
+00:01:11,920 --> 00:01:15,160
+I'm just going to delete it.
+
+14
+00:01:15,160 --> 00:01:22,880
+So you would think, now that we turned on our reference planes here, that we could use
+
+15
+00:01:22,880 --> 00:01:26,280
+those to mirror this type.
+
+16
+00:01:26,280 --> 00:01:31,960
+Go to tool and mirror.
+
+17
+00:01:31,960 --> 00:01:35,400
+Unfortunately, it does not work.
+
+18
+00:01:35,400 --> 00:01:43,080
+For these types of types, for the geometry based types, mirror doesn't work.
+
+19
+00:01:43,080 --> 00:01:49,360
+So you have to, for any one type, you have to create kind of the mirrored version of
+
+20
+00:01:49,360 --> 00:01:50,520
+that.
+
+21
+00:01:50,520 --> 00:01:56,900
+So right here, if I select it, the type is a 3480R.
+
+22
+00:01:56,900 --> 00:02:06,060
+So I've created corresponding 3480L if I activate it.
+
+23
+00:02:06,060 --> 00:02:08,840
+So that's just the mirrored version of it.
+
+24
+00:02:08,840 --> 00:02:17,600
+So if I move it in place there to have it mend itself to the wall, I'm just going to
+
+25
+00:02:17,600 --> 00:02:21,400
+isolate these objects here.
+
+26
+00:02:21,400 --> 00:02:26,600
+You select the door and then the wall and then apply void.
+
+27
+00:02:26,600 --> 00:02:31,500
+There you go.
+
+28
+00:02:31,500 --> 00:02:36,560
+So yeah, unfortunately, mirror doesn't work, but you have to create individual types for
+
+29
+00:02:36,560 --> 00:02:41,440
+a mirrored scenario like this.
+
+30
+00:02:41,440 --> 00:02:47,920
+So if you want a door to turn the other direction, unfortunately, there's no quick command to
+
+31
+00:02:47,920 --> 00:02:49,320
+do that.
+
+32
+00:02:49,320 --> 00:02:57,560
+So you actually physically have to rotate it and then move it back into place where
+
+33
+00:02:57,560 --> 00:03:03,040
+you want it.
+
+34
+00:03:03,040 --> 00:03:07,840
+And then do a Shift-G to regenerate the wall.
+
diff --git a/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library.srt b/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library.srt
new file mode 100644
index 0000000..c7aaebe
--- /dev/null
+++ b/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library.srt
@@ -0,0 +1,144 @@
+1
+00:00:00,000 --> 00:00:05,520
+So this is our materials library we've been putting together. Our typical
+
+2
+00:00:05,520 --> 00:00:13,800
+approach is to pull materials from the ODE textures library so just copy and
+
+3
+00:00:13,800 --> 00:00:25,680
+paste a cube from one blender session to the other and then we have to pull over
+
+4
+00:00:25,880 --> 00:00:31,960
+the textures from the ODE texture library over to the corresponding folder
+
+5
+00:00:31,960 --> 00:00:38,240
+in our project. So this becomes kind of tedious after a while so there's a way
+
+6
+00:00:38,240 --> 00:00:49,320
+to actually sync the entire ODE texture library into our current repo and I can
+
+7
+00:00:49,320 --> 00:00:59,480
+show you how to do that. So before we do though I need to delete this library
+
+8
+00:00:59,480 --> 00:01:10,640
+altogether. Then I'm going to go to our Git client which is a Git neuro that
+
+9
+00:01:10,640 --> 00:01:15,280
+we're using. I'm going to open the repo
+
+10
+00:01:18,160 --> 00:01:28,440
+and then I'm going to stage all those changes and I'm gonna say type it in
+
+11
+00:01:28,440 --> 00:01:33,280
+moving ODE texture folder in prep for adding ODE texture library as a sub
+
+12
+00:01:33,280 --> 00:01:45,440
+module and so I can commit that and now we can actually add a sub module and to
+
+13
+00:01:45,440 --> 00:01:54,560
+do that then click here and we have to go find the URL from the ODE texture
+
+14
+00:01:54,560 --> 00:02:00,880
+library which is here and copy that you can paste it there and then the
+
+15
+00:02:00,880 --> 00:02:09,600
+directory that we want to locate it in is going to be you know this slash model
+
+16
+00:02:09,600 --> 00:02:20,079
+folder ODE textures and then we can say create module pretty quick. So it might
+
+17
+00:02:20,079 --> 00:02:25,400
+take a while to download that entire repo but when it does you can check the
+
+18
+00:02:25,400 --> 00:02:32,960
+path and see if all the appropriate folders and files are there. One thing I
+
+19
+00:02:32,960 --> 00:02:40,160
+did wrong is when I added in the path to where to download the files I used a
+
+20
+00:02:40,160 --> 00:02:45,880
+backslash instead of a forward slash and so I corrected that in this Git module
+
+21
+00:02:45,880 --> 00:02:50,720
+file you won't necessarily have to mess with this but I'm just gonna submit this
+
+22
+00:02:50,720 --> 00:03:04,520
+change. I say fix path commit and you can actually add stage or commit the sub
+
+23
+00:03:04,520 --> 00:03:20,480
+module and there it will show up then in your list. So let's say we made a change
+
+24
+00:03:20,480 --> 00:03:30,120
+to the ODE texture library I'm just gonna add text file so test so that's a
+
+25
+00:03:30,120 --> 00:03:36,920
+change in the ODE texture repo in order to see that change with the Git narrow
+
+26
+00:03:36,920 --> 00:03:43,220
+you can't necessarily do it from here which would make sense you have to open
+
+27
+00:03:43,220 --> 00:03:51,980
+up that sub module sub modules basically are repos within repos so you navigate
+
+28
+00:03:51,980 --> 00:03:58,860
+to where the sub module is right there and say open and then here you can see
+
+29
+00:03:58,860 --> 00:04:03,460
+the change you made and do go through the same process of staging and then
+
+30
+00:04:03,460 --> 00:04:14,300
+committing it so I'm gonna just write testing I'm gonna stage that and commit
+
+31
+00:04:14,300 --> 00:04:21,100
+so you'll see here it says origin master snapshot that's where the timeline is on
+
+32
+00:04:21,100 --> 00:04:29,300
+the remote or on the website essentially and this is your local commit so this
+
+33
+00:04:29,300 --> 00:04:36,540
+commit has not been pushed yet to the remote so to do that we push it that way
+
+34
+00:04:36,540 --> 00:04:44,260
+so now these both are on the local and the remote are synced and so similarly
+
+35
+00:04:44,260 --> 00:04:49,460
+here this is the remote where it's at and this is local so we want to push
+
+36
+00:04:49,460 --> 00:04:52,940
+these changes to the remote
+
diff --git a/113000_20250418_1626 - Purging unused materials and styles from the file/113000_20250418_1626 - Purging unused materials and styles from the file.srt b/113000_20250418_1626 - Purging unused materials and styles from the file/113000_20250418_1626 - Purging unused materials and styles from the file.srt
new file mode 100644
index 0000000..ed014c4
--- /dev/null
+++ b/113000_20250418_1626 - Purging unused materials and styles from the file/113000_20250418_1626 - Purging unused materials and styles from the file.srt
@@ -0,0 +1,88 @@
+1
+00:00:00,000 --> 00:00:07,500
+So naturally as you're working you'll come up with styles and materials that
+
+2
+00:00:07,500 --> 00:00:13,000
+are not used or attached to any objects and there there's a quick way to purge
+
+3
+00:00:13,000 --> 00:00:18,240
+all those styles and materials that you don't use and you can tell if they're
+
+4
+00:00:18,240 --> 00:00:24,860
+being used or not by the number at this location here and see how many objects
+
+5
+00:00:24,860 --> 00:00:32,580
+are using it. So if you want to purge then all the styles that you're not
+
+6
+00:00:32,580 --> 00:00:39,140
+using you would go to purge data and before we do that we're gonna see we got
+
+7
+00:00:39,140 --> 00:00:48,220
+30 styles and we had 39 materials. So I'm just gonna do purge unused styles first.
+
+8
+00:00:48,220 --> 00:00:55,900
+So we went down to 28 surface styles and you'll notice there's some still
+
+9
+00:00:55,900 --> 00:01:00,660
+that say zero but they did not get deleted. The reason being most of the
+
+10
+00:01:00,660 --> 00:01:05,660
+time is that the style is attached to a material and so it's not going to delete
+
+11
+00:01:05,660 --> 00:01:13,460
+it if it has that connection. So if you go back to here and go to purge unused
+
+12
+00:01:13,460 --> 00:01:21,580
+materials and then purge styles you'll notice okay we lost another style so I
+
+13
+00:01:21,580 --> 00:01:27,300
+think it was that air gap style. So it was attached to material we delayed that
+
+14
+00:01:27,300 --> 00:01:32,740
+material and then we were able to delete the style. So a lot of times I like to
+
+15
+00:01:32,740 --> 00:01:38,860
+just click these back and forth and make sure everything's purged. There are
+
+16
+00:01:38,900 --> 00:01:47,740
+sometimes still styles of zero related to them. I haven't totally figured that
+
+17
+00:01:47,740 --> 00:01:55,539
+out yet I'm sure there's rhyme and reason to it and trying to see if it
+
+18
+00:01:55,539 --> 00:02:00,100
+applies to materials too. Sometimes it'll apply materials but doesn't look as
+
+19
+00:02:00,100 --> 00:02:07,700
+often but yes this is a way to purge stuff that you don't use and there's
+
+20
+00:02:07,740 --> 00:02:14,380
+also you can purge unused profiles and sorry unused types as well but I'm not
+
+21
+00:02:14,380 --> 00:02:18,060
+going to do that because there's some types in here that I want to use later
+
+22
+00:02:18,060 --> 00:02:21,660
+that are not applied quite yet.
+
diff --git a/114000_20250418_1640 - Creating a working drawing style/114000_20250418_1640 - Creating a working drawing style.srt b/114000_20250418_1640 - Creating a working drawing style/114000_20250418_1640 - Creating a working drawing style.srt
new file mode 100644
index 0000000..47a2ebe
--- /dev/null
+++ b/114000_20250418_1640 - Creating a working drawing style/114000_20250418_1640 - Creating a working drawing style.srt
@@ -0,0 +1,128 @@
+1
+00:00:00,000 --> 00:00:05,920
+If you remember a couple of videos ago, we had updated this blender default shading style
+
+2
+00:00:06,640 --> 00:00:16,240
+to not include the wireframe. But as you're working, a lot of times I like to have that on.
+
+3
+00:00:16,240 --> 00:00:22,240
+Turn on the opacity there to actually see the lines. But if you flip between drawings,
+
+4
+00:00:22,799 --> 00:00:26,640
+say go to the perspective, activate that.
+
+5
+00:00:32,239 --> 00:00:34,400
+The perspective then is using the same
+
+6
+00:00:37,440 --> 00:00:43,040
+shading styles default, so it turns the line work off again. You have to go back here and
+
+7
+00:00:43,040 --> 00:00:51,599
+then turn it on again. So to prevent having to do that all the time, I like to just create a new
+
+8
+00:00:52,320 --> 00:00:55,120
+shading style called
+
+9
+00:00:57,680 --> 00:01:08,320
+working. So we had turned the opacity up so we could actually see the line work,
+
+10
+00:01:09,520 --> 00:01:16,480
+created a new shading style, and then we want to save that drawing style
+
+11
+00:01:16,720 --> 00:01:20,400
+to this particular drawing, which is perspective.
+
+12
+00:01:22,400 --> 00:01:27,280
+So now if we want to go back to that other,
+
+13
+00:01:37,280 --> 00:01:44,880
+so this still has the blender default assigned to it. So let's say you're just working on this and
+
+14
+00:01:45,360 --> 00:01:53,679
+just for the temporary time you can activate that drawing style to this.
+
+15
+00:02:03,280 --> 00:02:14,480
+There it's applied to that drawing. So later on if you want to print this drawing,
+
+16
+00:02:14,880 --> 00:02:22,320
+and turn off all the rastered line work like we did a couple videos ago, then you would just go
+
+17
+00:02:22,320 --> 00:02:28,480
+back and activate the drawing style to that drawing before you print it out.
+
+18
+00:02:39,519 --> 00:02:42,480
+Let's print this drawing then.
+
+19
+00:02:44,880 --> 00:02:59,280
+So as you can see our reference plane line is still gone. One little tip
+
+20
+00:03:00,560 --> 00:03:11,280
+can provide is that if you see we're in the, it's called the rendered viewport shading mode for this.
+
+21
+00:03:12,160 --> 00:03:16,800
+When you're in this mode and you're switching drawings, or if your drawing style has this mode,
+
+22
+00:03:16,800 --> 00:03:24,800
+switching drawings takes longer time. If you're in this mode, switching drawings is quicker,
+
+23
+00:03:26,320 --> 00:03:35,040
+but if you print out the drawing in this mode it looks the same as this mode. So I like to
+
+24
+00:03:35,280 --> 00:03:42,480
+use this mode because it's easier to flip between drawings. So I'm going to update the drawing style
+
+25
+00:03:43,519 --> 00:03:53,680
+with that mode. So I'll select it and I'm going to save drawing style to update it.
+
+26
+00:03:55,680 --> 00:03:58,799
+So if I go to say first floor plan,
+
+27
+00:03:59,200 --> 00:04:06,800
+say first floor plan, then it's in that mode again and flip back.
+
+28
+00:04:08,800 --> 00:04:16,320
+You can see flipping between drawings is a little quicker now because we're in this material preview
+
+29
+00:04:16,320 --> 00:04:24,480
+viewport shading mode versus this rendered. So just a little trick. We go back to
+
+30
+00:04:25,360 --> 00:04:30,000
+that view and then run it again.
+
+31
+00:04:37,040 --> 00:04:39,520
+And if I flip between these two drawings here,
+
+32
+00:04:41,600 --> 00:04:44,000
+you can see there's no difference to how they're rendered out.
+
diff --git a/115000_20250507_1048 - Update on changes to model/115000_20250507_1048 - Update on changes to model.srt b/115000_20250507_1048 - Update on changes to model/115000_20250507_1048 - Update on changes to model.srt
new file mode 100644
index 0000000..9ed77f0
--- /dev/null
+++ b/115000_20250507_1048 - Update on changes to model/115000_20250507_1048 - Update on changes to model.srt
@@ -0,0 +1,440 @@
+1
+00:00:00,000 --> 00:00:02,840
+You can see a lot has changed since the last video.
+
+2
+00:00:04,500 --> 00:00:09,400
+I've modeled in the garage and then also modeled in the roof slabs and
+
+3
+00:00:10,520 --> 00:00:13,040
+roof trusses there.
+
+4
+00:00:14,040 --> 00:00:16,560
+And then modeled in a bunch of
+
+5
+00:00:17,360 --> 00:00:24,920
+reference planes, or IFC virtual elements. And most of these as you can see are on two-foot increments. They're arrays essentially and
+
+6
+00:00:26,020 --> 00:00:29,120
+they align with the roof trusses and
+
+7
+00:00:30,000 --> 00:00:31,400
+with the
+
+8
+00:00:31,400 --> 00:00:37,680
+floor joists at certain points. So it's just a little tool, modeling tool, to help align certain things.
+
+9
+00:00:38,519 --> 00:00:40,519
+So I can select the array
+
+10
+00:00:43,720 --> 00:00:45,720
+and hide them.
+
+11
+00:00:55,120 --> 00:00:57,200
+And you can also see I added a bunch of
+
+12
+00:00:57,200 --> 00:01:00,600
+horizontal reference planes as well.
+
+13
+00:01:01,560 --> 00:01:06,320
+These are at increments for pre-cut studs.
+
+14
+00:01:07,080 --> 00:01:13,300
+So eight foot or nine foot or ten foot pre-cut studs. So it allows me then to align
+
+15
+00:01:14,120 --> 00:01:17,220
+the walls up with those elements.
+
+16
+00:01:19,840 --> 00:01:21,840
+Turn on the materials there.
+
+17
+00:01:21,840 --> 00:01:23,160
+The
+
+18
+00:01:23,160 --> 00:01:30,440
+all the roof assemblies are in their own aggregate. So if I just select one thing and move it you can see
+
+19
+00:01:32,060 --> 00:01:37,679
+the parts that are in that aggregate. So doing this allows you to move the entire
+
+20
+00:01:38,440 --> 00:01:40,600
+roof up and down while you're designing.
+
+21
+00:01:42,720 --> 00:01:44,860
+You can see that's another aggregate there.
+
+22
+00:01:49,320 --> 00:01:51,320
+And another one here.
+
+23
+00:01:53,399 --> 00:01:55,759
+And the entry portal is aggregate as well.
+
+24
+00:01:57,479 --> 00:01:59,479
+And it's actually a linked aggregate.
+
+25
+00:02:00,600 --> 00:02:02,600
+You select that
+
+26
+00:02:03,960 --> 00:02:05,600
+and go to
+
+27
+00:02:05,600 --> 00:02:07,759
+linked aggregates. Select all
+
+28
+00:02:08,400 --> 00:02:11,640
+the linked ones. You can see that there's another entry portal over here.
+
+29
+00:02:12,440 --> 00:02:16,579
+That's modeled in this is a hundred feet away from the house.
+
+30
+00:02:18,200 --> 00:02:20,200
+So for in
+
+31
+00:02:20,280 --> 00:02:27,760
+the actual project, it's a pocket neighborhood, this building type is rotated or mirrored or whatever and sometimes the entryway
+
+32
+00:02:28,239 --> 00:02:33,119
+needs to be on this side of the house. So I just modeled that over there a hundred feet away
+
+33
+00:02:33,959 --> 00:02:35,959
+for that situation.
+
+34
+00:02:38,679 --> 00:02:43,519
+So I created new roof types. I have see roofs
+
+35
+00:02:43,520 --> 00:02:45,520
+that
+
+36
+00:02:45,560 --> 00:02:51,780
+are composed of this one's composed of two layers, asphalt shingles and then the OSB layer there.
+
+37
+00:02:52,920 --> 00:02:57,920
+If I select all those types, I can hide it. And I also created this
+
+38
+00:02:59,160 --> 00:03:03,340
+roof slab as well. It's made of shingles, OSB and then
+
+39
+00:03:04,320 --> 00:03:07,240
+T111. You can have kind of exposed
+
+40
+00:03:10,160 --> 00:03:12,260
+T111 underneath the overhangs like that.
+
+41
+00:03:14,440 --> 00:03:17,040
+Select all those types, hide them.
+
+42
+00:03:19,120 --> 00:03:21,900
+Created this roof truss here, which is a linked aggregate.
+
+43
+00:03:23,440 --> 00:03:27,360
+Go here and select all those. You can see that they're all connected. And
+
+44
+00:03:28,720 --> 00:03:34,600
+then the end overhang there, the lookouts, those are all linked aggregates as well. You can see
+
+45
+00:03:35,600 --> 00:03:37,600
+there.
+
+46
+00:03:40,680 --> 00:03:43,240
+So I'm gonna hide these aggregates then.
+
+47
+00:04:04,600 --> 00:04:06,600
+I
+
+48
+00:04:09,280 --> 00:04:13,200
+think I need to hide that one or add it to that other aggregate.
+
+49
+00:04:17,120 --> 00:04:19,880
+I've also, too, you notice
+
+50
+00:04:21,600 --> 00:04:27,280
+we had these horizontal reference planes in here, but I also created a
+
+51
+00:04:30,280 --> 00:04:32,880
+horizontal layered type
+
+52
+00:04:35,000 --> 00:04:41,340
+As you can see, I can select it and tab into it. It's actually extruded profile essentially.
+
+53
+00:04:43,560 --> 00:04:46,160
+And I located them at the height of these
+
+54
+00:04:46,840 --> 00:04:48,840
+pre-cut studs. And
+
+55
+00:04:49,200 --> 00:04:53,240
+what I do with that is I use that
+
+56
+00:04:54,280 --> 00:04:57,240
+to extend the walls to.
+
+57
+00:04:57,840 --> 00:05:02,680
+So for example, I'm just gonna hide this outer one. Hide that further one.
+
+58
+00:05:03,680 --> 00:05:09,240
+So I take this wall and I can extend it to this object.
+
+59
+00:05:09,720 --> 00:05:11,720
+So if I select the wall and then
+
+60
+00:05:12,360 --> 00:05:14,360
+select that
+
+61
+00:05:15,240 --> 00:05:17,960
+type, you can hit shift E.
+
+62
+00:05:19,880 --> 00:05:25,920
+Sorry, I gotta get in a BIM mode there. Shift E and it actually extends the wall to that object.
+
+63
+00:05:25,920 --> 00:05:29,360
+I can do that one and do shift E.
+
+64
+00:05:30,360 --> 00:05:36,760
+Let's do the right order and shift E. So that's just a tool to help me
+
+65
+00:05:38,320 --> 00:05:40,320
+extend the walls to certain dimensions.
+
+66
+00:05:46,360 --> 00:05:49,240
+So I also created a few drawings, I believe.
+
+67
+00:05:54,320 --> 00:05:57,040
+In particular, some just working drawings.
+
+68
+00:05:59,360 --> 00:06:01,360
+There's nothing I guess new there.
+
+69
+00:06:10,360 --> 00:06:18,320
+This one you can see is I had a bunch of dimensions for those pre-cut studs. They align with the reference planes there.
+
+70
+00:06:20,680 --> 00:06:25,560
+So these working drawings are just used to help me model out more accurately.
+
+71
+00:06:25,880 --> 00:06:28,680
+So for example, I just put a bunch of dimensions here.
+
+72
+00:06:29,640 --> 00:06:35,040
+Relative to those reference planes to show kind of pre-cut stud dimensions.
+
+73
+00:06:35,560 --> 00:06:39,040
+You know, in line with where the truss is at and those types of things.
+
+74
+00:06:39,920 --> 00:06:42,920
+So another thing to note is,
+
+75
+00:06:43,480 --> 00:06:47,800
+I can select these reference planes here.
+
+76
+00:06:49,440 --> 00:06:53,760
+I made two different types of reference planes that are vertical.
+
+77
+00:06:54,760 --> 00:07:02,520
+One reference plane is reference plan North-South and then the other one is reference plan East-West.
+
+78
+00:07:03,120 --> 00:07:05,120
+And the reason I did that is,
+
+79
+00:07:06,120 --> 00:07:10,520
+in this view, if you shot the drawing or ran the drawing,
+
+80
+00:07:12,120 --> 00:07:20,240
+before the reference plane that went East-West showed up in the drawing and there was no way to really turn it off.
+
+81
+00:07:20,240 --> 00:07:29,240
+So I made two reference plane types so I could turn off one relative to the drawing.
+
+82
+00:07:30,240 --> 00:07:36,240
+So if I switch to the other East there working,
+
+83
+00:07:38,240 --> 00:07:43,240
+you can see the reference plane there is reference plan East-West.
+
+84
+00:07:43,240 --> 00:07:46,240
+So the other ones then turned off in this view.
+
+85
+00:07:46,240 --> 00:07:51,240
+So it helped clean up the drawings a little more.
+
+86
+00:07:53,240 --> 00:07:56,240
+I change a view here, orthogonal.
+
+87
+00:07:57,240 --> 00:07:59,240
+Turn on the whole model that way.
+
+88
+00:08:01,240 --> 00:08:09,240
+I also created a new wall type here which is similar to the wall type on the exterior of the house.
+
+89
+00:08:10,240 --> 00:08:15,240
+But if you zoom in, it just doesn't have drywall on the inside there.
+
+90
+00:08:16,240 --> 00:08:18,240
+So nothing really major.
+
+91
+00:08:20,240 --> 00:08:26,240
+Then I changed these window types here just to include this kind of faux header on there.
+
+92
+00:08:27,240 --> 00:08:31,240
+It will just be kind of a 1 by 10 trim piece is all.
+
+93
+00:08:33,240 --> 00:08:35,240
+And this is a new type I believe too.
+
+94
+00:08:36,240 --> 00:08:39,240
+Essentially rigid insulation.
+
+95
+00:08:40,240 --> 00:08:45,240
+I call it out as galvanized sheet metal over the rigid insulation there.
+
+96
+00:08:46,240 --> 00:08:54,240
+I could probably actually add another layer to that to have the galvanized layer and then the rigid which I might do later on.
+
+97
+00:08:55,240 --> 00:09:01,240
+Then I created this type here which is I believe vertical layers that are sloped,
+
+98
+00:09:02,240 --> 00:09:07,240
+that are underneath the thickened edge footer there.
+
+99
+00:09:10,240 --> 00:09:20,240
+If I go to these trusses here and actually select the individual aggregate here and isolate it.
+
+100
+00:09:22,240 --> 00:09:27,240
+You notice the top cord of this truss here has a little notch here, a rip.
+
+101
+00:09:27,240 --> 00:09:40,240
+That's to accommodate the T-111 that's going to come down and sit there so everything, the top half inch OSB kind of aligns.
+
+102
+00:09:41,240 --> 00:09:45,240
+I did that little notch using a void.
+
+103
+00:09:46,240 --> 00:09:49,240
+If I turn on the voids you can see that void there.
+
+104
+00:09:50,240 --> 00:09:52,240
+It's just an extruded void.
+
+105
+00:09:57,240 --> 00:10:05,240
+It looks like I need to fix this little overhang here.
+
+106
+00:10:06,240 --> 00:10:08,240
+That's not right.
+
+107
+00:10:09,240 --> 00:10:15,240
+So it's probably not worth mentioning but yeah I've created a lot of new beam types.
+
+108
+00:10:15,240 --> 00:10:23,240
+You know, a facial beam type and these 2x8 members.
+
+109
+00:10:24,240 --> 00:10:28,240
+Also I think there's blocking there.
+
+110
+00:10:29,240 --> 00:10:33,240
+So relatively straightforward.
+
diff --git a/116000_20250507_1246 - Creating and editing roofs - 2 ways/116000_20250507_1246 - Creating and editing roofs - 2 ways.srt b/116000_20250507_1246 - Creating and editing roofs - 2 ways/116000_20250507_1246 - Creating and editing roofs - 2 ways.srt
new file mode 100644
index 0000000..1408053
--- /dev/null
+++ b/116000_20250507_1246 - Creating and editing roofs - 2 ways/116000_20250507_1246 - Creating and editing roofs - 2 ways.srt
@@ -0,0 +1,172 @@
+1
+00:00:00,000 --> 00:00:06,240
+So there's two ways to create a roof. One way is similar to how we create a slab,
+
+2
+00:00:06,240 --> 00:00:12,400
+an IFC slab. It's the same approach but then there's also a second way that's a
+
+3
+00:00:12,400 --> 00:00:19,280
+more parametric similar to kind of a parametric stair or parametric door. But
+
+4
+00:00:19,280 --> 00:00:25,960
+first I'll show you just a more standard horizontal layer approach. So go here, go
+
+5
+00:00:25,960 --> 00:00:32,280
+to your launcher and create a new type. This is going to be IFC roof. You do a
+
+6
+00:00:32,280 --> 00:00:37,760
+gable one. And for representation we're going to do horizontal layers. We'll do
+
+7
+00:00:37,760 --> 00:00:48,240
+roof next but horizontal layers. And just say test. Test one. Make that active and
+
+8
+00:00:48,400 --> 00:00:52,600
+then place that in world somewhere.
+
+9
+00:00:56,640 --> 00:01:07,720
+C for close. So this is where you can actually change the slope of the roof.
+
+10
+00:01:07,720 --> 00:01:14,280
+You can see there. And doing that if you zoom in on the corners or straight on
+
+11
+00:01:14,520 --> 00:01:21,720
+you can see that it truncates the roof. I'm moving it to the side easier to see.
+
+12
+00:01:21,720 --> 00:01:31,200
+So you change that angle and it still keeps the ends vertical like that. Or you
+
+13
+00:01:31,200 --> 00:01:37,280
+can set that to zero and you can actually just rotate itself like that. So
+
+14
+00:01:37,280 --> 00:01:42,360
+it depends on the condition or what you're trying to do. So I'm just gonna
+
+15
+00:01:42,400 --> 00:01:52,640
+set this to 15. There's two ways to edit a roof like this. One way is to edit the
+
+16
+00:01:52,640 --> 00:01:59,680
+profile here and it would be a shift E. You can see that the profile shape gets
+
+17
+00:01:59,680 --> 00:02:05,120
+flattened horizontally which is nice because a lot of times when you're
+
+18
+00:02:05,120 --> 00:02:09,560
+changing the profile of a roof you want to snap it to something in an orthogonal
+
+19
+00:02:09,800 --> 00:02:16,520
+way or you know from top down. Then tab out of it when you're done. And the other
+
+20
+00:02:16,520 --> 00:02:22,360
+way is to tab into it. Just purely tabbing into it. So if you tab it in this
+
+21
+00:02:22,360 --> 00:02:29,800
+manner the profile follows the slope of the roof. So I use both approaches
+
+22
+00:02:29,800 --> 00:02:33,720
+depending on what I'm trying to snap to. So just note that there's two ways of
+
+23
+00:02:33,720 --> 00:02:41,280
+doing that. So the second way to make a roof is to use the parametric roof. And
+
+24
+00:02:41,280 --> 00:02:50,960
+again we'll go to launcher. Create a new type and you can say roof here. Use that.
+
+25
+00:02:51,000 --> 00:03:05,320
+And okay. Make that active and place it in world here. Oops, placed two of them. So
+
+26
+00:03:05,320 --> 00:03:10,480
+similar to parametric stairs or doors you're gonna change the parameters of
+
+27
+00:03:10,519 --> 00:03:26,839
+this roof over here. So slope or angle they're kind of tethered together. Or you
+
+28
+00:03:26,839 --> 00:03:34,399
+can change the rafter edge angle. So say 45. You can see the angle changes there
+
+29
+00:03:34,400 --> 00:03:40,840
+if I zoom in on it. I'm gonna just change that back to 90. And then roof
+
+30
+00:03:40,840 --> 00:03:48,200
+thickness here. Let's see. So one unfortunate part is this parametric roof
+
+31
+00:03:48,200 --> 00:03:54,500
+does not accommodate layers. It's only one layer essentially. It's monolithic. So
+
+32
+00:03:54,500 --> 00:03:59,300
+that's the reason I don't necessarily use the parametric roof that much. But it
+
+33
+00:03:59,300 --> 00:04:08,340
+is nice for doing hip roofs as you can see here. If you tab into it you can
+
+34
+00:04:08,340 --> 00:04:18,340
+change or add more subdivisions to it so you can get more complicated roofs.
+
+35
+00:04:18,339 --> 00:04:32,120
+Like that. You can actually create gable ends with this tool as well. So let's say
+
+36
+00:04:32,120 --> 00:04:38,520
+you want a gable on here. You can set gable roof angle here. And it does it
+
+37
+00:04:38,520 --> 00:04:46,479
+automatically 90 here. If you try other angles it kind of breaks the geometry. So
+
+38
+00:04:46,620 --> 00:04:54,100
+just 90 is the only one that works essentially. You can tab out of it. If you
+
+39
+00:04:54,100 --> 00:05:03,300
+want to change it back I believe you set it to zero. There it goes. Sets it back
+
+40
+00:05:03,300 --> 00:05:14,820
+again. So let's say we want gables there. 90. Tab out of it.
+
+41
+00:05:14,960 --> 00:05:20,920
+So for these roofs then in the project I used the horizontal layer approach. If
+
+42
+00:05:20,920 --> 00:05:29,360
+you isolate it zoom in on it you can see that I just rotated the roof in space.
+
+43
+00:05:29,360 --> 00:05:36,400
+This is also IFC roof. Zoom in and see the layers there.
+
diff --git a/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets.srt b/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets.srt
new file mode 100644
index 0000000..7b75ec9
--- /dev/null
+++ b/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets.srt
@@ -0,0 +1,148 @@
+1
+00:00:00,000 --> 00:00:05,200
+Since the last video I took some time and effort to annotate all these
+
+2
+00:00:05,200 --> 00:00:12,800
+drawings as sections and floor plans and elevations. A majority of what I did is
+
+3
+00:00:12,800 --> 00:00:19,280
+added these leader lines here. They're intelligent leader lines. There's
+
+4
+00:00:19,280 --> 00:00:25,120
+about two or three different types. Say for example if I select on this one you
+
+5
+00:00:25,120 --> 00:00:31,520
+can tell from the literal here that it's using the search syntax type.description
+
+6
+00:00:31,520 --> 00:00:40,960
+to pull out the type's description. So if I click on this footer here and go to
+
+7
+00:00:40,960 --> 00:00:46,080
+the type you can see this is the description that it's pulling out so if
+
+8
+00:00:46,080 --> 00:00:53,040
+I add something to it it should change there on the leader. The other leader
+
+9
+00:00:53,199 --> 00:01:00,080
+type I'm using is pulling out the material layer names. So this one is
+
+10
+00:01:00,080 --> 00:01:05,600
+pulling out the second one means basically the second layer in that wall
+
+11
+00:01:06,640 --> 00:01:13,520
+and then this one is pulling out the first layer. So again if you ultimately want to change that
+
+12
+00:01:15,360 --> 00:01:16,480
+go to materials
+
+13
+00:01:18,800 --> 00:01:22,080
+say we want to okay shift click on that to expand all of them
+
+14
+00:01:23,040 --> 00:01:30,400
+we're going to search for damp waterproofing and here we can just change it the name if we want
+
+15
+00:01:30,400 --> 00:01:34,720
+just add something so there are changes there.
+
+16
+00:01:39,120 --> 00:01:50,480
+One technique that might come in handy is right now if I click on that leader you can see that
+
+17
+00:01:50,480 --> 00:01:58,640
+it's pulling out the first layer. If you delete the number and the period and just have that
+
+18
+00:02:00,080 --> 00:02:07,680
+and say okay it actually pulls out all the layer names in that wall in that object
+
+19
+00:02:08,400 --> 00:02:16,400
+and it separates them by a comma there you can see so siding batten board is one layer
+
+20
+00:02:16,400 --> 00:02:23,120
+and then building wrap over the cdx blah blah blah is down to this and then there's another
+
+21
+00:02:23,120 --> 00:02:29,920
+layer there so that might come in handy that might be confusing but just know that it exists and you
+
+22
+00:02:29,920 --> 00:02:36,560
+could use it potentially. So if I run this drawing do control click on that icon there
+
+23
+00:02:36,720 --> 00:02:42,720
+you'll see one of these section tags here doesn't have the drawing number and the sheet number
+
+24
+00:02:43,280 --> 00:02:49,200
+that's because that particular section is not placed on a sheet it's just an actual working
+
+25
+00:02:49,200 --> 00:02:57,680
+drawing for example if I click on that you'll see that it's called section kitchen east west south
+
+26
+00:02:57,680 --> 00:03:02,560
+working so it's actually this drawing here so let's say for example if I click on that
+
+27
+00:03:02,560 --> 00:03:08,880
+section mark on your drawings because it's just a working drawing so to turn that off
+
+28
+00:03:10,160 --> 00:03:15,840
+activate the drawing and this is new actually a recent development a couple weeks ago
+
+29
+00:03:17,040 --> 00:03:22,560
+to activate the drawing now there used to be an icon up here but now to activate the drawing it's
+
+30
+00:03:22,560 --> 00:03:28,400
+next to the drawing name so I need to click on that camera and then I can go back to the drawing
+
+31
+00:03:28,400 --> 00:03:33,040
+it's next to the drawing name so all I need to do is click on that camera drawing it's
+
+32
+00:03:33,040 --> 00:03:36,640
+next to the drawing name so all I need to do is click on that camera
+
+33
+00:03:41,920 --> 00:03:47,600
+and select the drawing outline there go to properties and down to your
+
+34
+00:03:47,920 --> 00:03:58,480
+pset and you want to turn off the global referencing here and say okay
+
+35
+00:04:00,640 --> 00:04:04,799
+so now we go back to that drawing that we were just at which was this one
+
+36
+00:04:11,040 --> 00:04:17,120
+you'll see that the section mark is still there but if you select it and delete it
+
+37
+00:04:17,600 --> 00:04:26,480
+but if you activate the drawing again it should stay deleted or should not come back
+
diff --git a/118000_20250515_1255 - Copying annotation from one drawing to another/118000_20250515_1255 - Copying annotation from one drawing to another.srt b/118000_20250515_1255 - Copying annotation from one drawing to another/118000_20250515_1255 - Copying annotation from one drawing to another.srt
new file mode 100644
index 0000000..f728bad
--- /dev/null
+++ b/118000_20250515_1255 - Copying annotation from one drawing to another/118000_20250515_1255 - Copying annotation from one drawing to another.srt
@@ -0,0 +1,104 @@
+1
+00:00:00,000 --> 00:00:06,240
+So sometimes it's nice to copy and paste annotation from one drawing to the next.
+
+2
+00:00:06,960 --> 00:00:14,400
+Unfortunately there's not a quick and dirty way to copy and paste but it's possible. So for example
+
+3
+00:00:14,400 --> 00:00:22,080
+on this west elevation here we have all these text leaders and dimensions and I'd like to copy them
+
+4
+00:00:22,080 --> 00:00:30,400
+to this section which is essentially the same section but it's cut further back in the x
+
+5
+00:00:30,400 --> 00:00:36,320
+direction but you can see that the orientation is the same. So what I want to do again is take
+
+6
+00:00:37,200 --> 00:00:43,120
+all the annotation from this drawing and transfer it to the other one. So
+
+7
+00:00:46,160 --> 00:00:51,519
+we're going to take dimensions first. Select just any one dimension and then you can click the
+
+8
+00:00:52,080 --> 00:00:58,960
+object type there. It selects all of them and then you click control and get the text leader
+
+9
+00:00:58,960 --> 00:01:04,720
+here and then click on the object type there. So now I have all the text leaders and all the
+
+10
+00:01:04,720 --> 00:01:09,600
+dimensions in that drawing and so I'm going to do a shift d
+
+11
+00:01:12,560 --> 00:01:15,360
+and you can see them duplicated. I'm just going to right click to
+
+12
+00:01:16,240 --> 00:01:20,240
+duplicate them in place and I'm going to
+
+13
+00:01:22,560 --> 00:01:26,160
+move them now. You see how it's highlighted in the outlier. I'm going to move them down
+
+14
+00:01:27,120 --> 00:01:35,120
+click and hold and drag them into that drawing. So that's the first step. The next step is to
+
+15
+00:01:35,600 --> 00:01:46,160
+assign those annotations to the drawing group.
+
+16
+00:01:48,720 --> 00:02:00,080
+So west I believe it was this one right here garage west. So I'm going to click on here,
+
+17
+00:02:00,640 --> 00:02:01,520
+assign to group,
+
+18
+00:02:06,480 --> 00:02:09,199
+and then go back to your object properties
+
+19
+00:02:11,200 --> 00:02:17,520
+and under miscellaneous there and groups. I'm going then now to delete the
+
+20
+00:02:18,240 --> 00:02:21,200
+other one the entry west group
+
+21
+00:02:24,000 --> 00:02:27,920
+and now hopefully if I go activate that drawing
+
+22
+00:02:30,320 --> 00:02:37,760
+all those copied annotations should now be yes in that drawing there. So depending on the depth of
+
+23
+00:02:37,760 --> 00:02:46,240
+the two cameras for the drawings you might have to after doing this you might have to move the
+
+24
+00:02:46,240 --> 00:02:54,160
+actual annotation in the z relative to the drawing. You'll know that is when you do this and you're
+
+25
+00:02:54,160 --> 00:03:00,720
+trying to select an annotation you can't select it that means that it's probably behind the camera
+
+26
+00:03:00,720 --> 00:03:14,240
+and you got to just move it so it's in front of the camera.
+
diff --git a/119000_20250515_1651 - Creating IfcSpaces/119000_20250515_1651 - Creating IfcSpaces.srt b/119000_20250515_1651 - Creating IfcSpaces/119000_20250515_1651 - Creating IfcSpaces.srt
new file mode 100644
index 0000000..1a0dfd3
--- /dev/null
+++ b/119000_20250515_1651 - Creating IfcSpaces/119000_20250515_1651 - Creating IfcSpaces.srt
@@ -0,0 +1,152 @@
+1
+00:00:00,000 --> 00:00:05,120
+So now that we have all our walls in place, let's start creating room objects
+
+2
+00:00:05,120 --> 00:00:12,120
+or in IFC land is our IFC spaces. So before we do let me turn off the
+
+3
+00:00:12,120 --> 00:00:18,120
+reference planes here. Place the cursor somewhere in the room where you want to
+
+4
+00:00:18,120 --> 00:00:24,600
+create the IFC space. First you want to make sure to make your default floor the
+
+5
+00:00:24,600 --> 00:00:32,840
+one you're on. Use this tool, the spatial tool, and make sure this RL, which
+
+6
+00:00:32,840 --> 00:00:40,800
+I think stands for relative level or elevation, is set at a dimension that's
+
+7
+00:00:40,800 --> 00:00:47,840
+inside the space. So at 3.3 and we're on the first floor that dimension will be
+
+8
+00:00:47,840 --> 00:00:53,320
+inside the space. So that's good. So from there you can generate space from cursor.
+
+9
+00:00:53,320 --> 00:01:02,440
+You can see it creates a space there. So if we click over here and we for example
+
+10
+00:01:02,440 --> 00:01:15,160
+let's actually delete this space. So if we're over here and we set this to zero
+
+11
+00:01:15,160 --> 00:01:20,360
+that's actually at the bottom edge of those walls and sometimes the tolerance
+
+12
+00:01:20,400 --> 00:01:28,480
+is not good enough and you'll see that space bleeds into the next. See there it
+
+13
+00:01:28,480 --> 00:01:35,120
+goes the space that bled into the next one. So just make sure that RL values
+
+14
+00:01:35,120 --> 00:01:43,560
+somewhere in the space too. Let's redo this one here. Click here and redo this
+
+15
+00:01:43,560 --> 00:01:52,640
+one. So these spaces are intelligent and they're connected to the wall so if you
+
+16
+00:01:52,640 --> 00:01:59,520
+move the wall say a foot and then you shift G to regenerate the space it'll
+
+17
+00:01:59,520 --> 00:02:04,440
+correct the space again. So what happens if you have a space that's not bound by
+
+18
+00:02:04,440 --> 00:02:11,039
+a wall but you want to create one. So for example this larger space is the living
+
+19
+00:02:11,039 --> 00:02:15,040
+room kitchen and dining room but there's no wall on one side to bound it.
+
+20
+00:02:15,040 --> 00:02:23,000
+In that scenario you use or I use IFC virtual element same class or element
+
+21
+00:02:23,000 --> 00:02:29,040
+that we use for our reference planes. So to do that put the 3d cursor somewhere
+
+22
+00:02:29,040 --> 00:02:37,399
+and just add a simple plane. I'm going to zoom into it and isolate it. I'm going to
+
+23
+00:02:37,400 --> 00:02:44,520
+rotate it 90 degrees up. So for these bounding planes then you want the local
+
+24
+00:02:44,520 --> 00:02:54,120
+axis to be oriented in a in in a particular fashion. The green or the y
+
+25
+00:02:54,120 --> 00:03:00,720
+axis needs to be up vertical but the blue or the Z needs to be parallel along
+
+26
+00:03:00,720 --> 00:03:08,440
+the plane. So to do that we'll turn on the effect origins turn that 90 so now
+
+27
+00:03:08,440 --> 00:03:15,360
+the blue axis is along the plane there. So then yes we want to convert it to I
+
+28
+00:03:15,360 --> 00:03:23,280
+see virtual element there we go and I like to give it an object type called
+
+29
+00:03:23,280 --> 00:03:30,680
+space boundary you can probably call it whatever you want but just a way to use
+
+30
+00:03:30,680 --> 00:03:40,560
+select these if you need to in the future. So go back to your view and I'm
+
+31
+00:03:40,560 --> 00:03:57,720
+going to tab into this and change the bounds here so it crosses the wall there
+
+32
+00:03:57,720 --> 00:04:05,920
+isolated again I'm gonna make this about I don't know eight feet tall. I
+
+33
+00:04:05,920 --> 00:04:11,720
+think I've noticed if it's any less than four feet it doesn't bound the space
+
+34
+00:04:11,720 --> 00:04:14,360
+correctly.
+
+35
+00:04:17,519 --> 00:04:23,720
+All right so now we can place our just want to make sure I'm tabbed out of it
+
+36
+00:04:23,720 --> 00:04:35,960
+correctly here. There you go. So place your 3d cursor there and hopefully we
+
+37
+00:04:35,960 --> 00:04:42,520
+generate the space and it'll use that boundary there we go and again if we
+
+38
+00:04:42,520 --> 00:04:53,640
+want to move that select the space and regenerate and it should.
+
diff --git a/120000_20250519_1124 - Using space tags/120000_20250519_1124 - Using space tags.srt b/120000_20250519_1124 - Using space tags/120000_20250519_1124 - Using space tags.srt
new file mode 100644
index 0000000..491d89e
--- /dev/null
+++ b/120000_20250519_1124 - Using space tags/120000_20250519_1124 - Using space tags.srt
@@ -0,0 +1,196 @@
+1
+00:00:00,000 --> 00:00:05,500
+So I've taken the time to add the IFC spaces throughout the project. So I can
+
+2
+00:00:05,500 --> 00:00:11,940
+select one of these spaces and select the entire class. I'll just move them out
+
+3
+00:00:11,940 --> 00:00:15,820
+of the way a little bit so you can see see them a little better. So those are
+
+4
+00:00:15,820 --> 00:00:22,500
+all the IFC spaces I made with the walls and the IFC virtual elements. So if we
+
+5
+00:00:22,500 --> 00:00:29,020
+want to tag then the IFC space, we'd go to this tool and switch this to space tag.
+
+6
+00:00:29,020 --> 00:00:37,900
+And then select the tag, alt space, and then do bulk tag. And that should
+
+7
+00:00:37,900 --> 00:00:43,980
+intelligently connect that tag to that space. So if you select the tag you can
+
+8
+00:00:43,980 --> 00:00:48,980
+see over here that it's pulling out the space name, space description, and then
+
+9
+00:00:48,980 --> 00:00:56,420
+the square foot area of the space as well. So we haven't performed a quantity
+
+10
+00:00:56,420 --> 00:01:02,900
+take off on that space yet so that's why it's zero. So let's try that. Switch this
+
+11
+00:01:02,900 --> 00:01:09,260
+to blender and then perform quantity take off. And there it switches. If you
+
+12
+00:01:09,260 --> 00:01:14,940
+select the tag, let's say we want to get rid of the decimal places altogether, we
+
+13
+00:01:14,940 --> 00:01:19,900
+do that here. Let's switch this to one.
+
+14
+00:01:19,900 --> 00:01:27,740
+And say okay and then let's just run this to see what it looks like so far.
+
+15
+00:01:27,740 --> 00:01:35,780
+Back to our drawings and then control click on that. We zoom in. So we see this
+
+16
+00:01:35,780 --> 00:01:43,180
+space which is called space right now. None is the description I believe and
+
+17
+00:01:43,180 --> 00:01:48,140
+then yes the square footage. So you can see that little rectangle there that's
+
+18
+00:01:48,180 --> 00:01:55,140
+actually in the SVG symbol file. So you could change that if you wanted to like
+
+19
+00:01:55,140 --> 00:02:00,460
+we did a number of videos ago. Change the color, the shape, or you could actually
+
+20
+00:02:00,460 --> 00:02:07,220
+put all these three into rectangles if you want. But if we go back let's say we
+
+21
+00:02:07,220 --> 00:02:16,220
+want to have our square foot say SF our square foot at that very end. You can
+
+22
+00:02:16,260 --> 00:02:22,980
+just type it in there. And I'm actually gonna remove description. I don't
+
+23
+00:02:22,980 --> 00:02:36,660
+necessarily like that in my space tag. And I'm going to add, let's see here, long
+
+24
+00:02:36,660 --> 00:02:50,019
+name instead. Say okay. Oh I had to do the justification. Text was center. And I'm
+
+25
+00:02:50,019 --> 00:02:58,740
+going to select the space again and start populating it then with data. So I
+
+26
+00:02:58,740 --> 00:03:03,220
+liked it for the name. It might be counterintuitive but you'll run into
+
+27
+00:03:03,220 --> 00:03:09,580
+this a lot. For the name I like to use just the number and then for the long
+
+28
+00:03:09,580 --> 00:03:18,900
+name is that's where I use the overall name of the room. So living room. And say okay.
+
+29
+00:03:19,900 --> 00:03:31,060
+So select a tag again. If you look go back to the printout here it would be
+
+30
+00:03:31,060 --> 00:03:38,060
+nice to put the number of the room in that rectangle. To Bonsai then and enable
+
+31
+00:03:38,060 --> 00:03:42,860
+editing text. You can see the name which is really the number. We'd like to
+
+32
+00:03:42,860 --> 00:03:48,140
+move that down one. And there's functionality here that allows us to do
+
+33
+00:03:48,140 --> 00:03:52,060
+that. So if I click down there you can see the name jump down to the second
+
+34
+00:03:52,060 --> 00:04:01,980
+level. But if I say okay to the text the number jumps up again. You can see
+
+35
+00:04:01,980 --> 00:04:07,500
+it's there at the first level. So there's a little quirk there that's not working
+
+36
+00:04:07,500 --> 00:04:16,180
+necessarily. So if you want to change the order unfortunately you have to just
+
+37
+00:04:16,180 --> 00:04:28,300
+create a new literal. So if I add another one down here and I get rid of this you
+
+38
+00:04:28,300 --> 00:04:35,500
+can see the orders starting to change. So we want square footage last so I'm going
+
+39
+00:04:35,500 --> 00:04:45,860
+to add another one. Take this copy paste it down here. And I get rid of this.
+
+40
+00:04:46,180 --> 00:04:54,820
+Change the justification there and then say okay. So living room yep the number
+
+41
+00:04:54,820 --> 00:05:05,100
+and then the square footage. So if we run the drawing again. So there we go the
+
+42
+00:05:05,100 --> 00:05:12,140
+numbers in the rectangle there then. So if you zoom out you can see that it's
+
+43
+00:05:12,140 --> 00:05:19,140
+actually printing our IFC spaces and we probably don't want that to happen. So
+
+44
+00:05:19,140 --> 00:05:24,460
+let's turn them off in our drawing. So go to your drawings and under element
+
+45
+00:05:24,460 --> 00:05:34,900
+filters here you can add another filter here and say IFC space. And then we want
+
+46
+00:05:34,900 --> 00:05:43,739
+to save it because we've saved these filters essentially. So we want to save
+
+47
+00:05:43,739 --> 00:05:51,299
+it and it's called plan. So this will overwrite the previous plan save search
+
+48
+00:05:51,299 --> 00:06:01,419
+that we have in there. Okay and then we'll run it to turn off the spaces. And
+
+49
+00:06:01,420 --> 00:06:11,740
+then hopefully when we rerun the drawing again it'll be gone. There we go.
+
diff --git a/121000_20250519_1627 - Creating schedules/121000_20250519_1627 - Creating schedules.srt b/121000_20250519_1627 - Creating schedules/121000_20250519_1627 - Creating schedules.srt
new file mode 100644
index 0000000..a003b1e
--- /dev/null
+++ b/121000_20250519_1627 - Creating schedules/121000_20250519_1627 - Creating schedules.srt
@@ -0,0 +1,656 @@
+1
+00:00:00,000 --> 00:00:08,120
+So let's create a room finish schedule and we will populate our spaces with certain properties
+
+2
+00:00:08,120 --> 00:00:10,120
+So then we can use that
+
+3
+00:00:10,240 --> 00:00:15,740
+To create a room schedule. So first I'm going to select that space
+
+4
+00:00:17,360 --> 00:00:19,360
+And let's start adding some
+
+5
+00:00:19,720 --> 00:00:22,800
+P-sets here. Let's start with space occupancy
+
+6
+00:00:23,520 --> 00:00:25,120
+requirements
+
+7
+00:00:25,120 --> 00:00:26,880
+add that
+
+8
+00:00:26,880 --> 00:00:28,880
+and I'm just gonna say
+
+9
+00:00:29,560 --> 00:00:34,160
+For occupancy type I'm gonna say habitable and say okay
+
+10
+00:00:37,280 --> 00:00:43,120
+And then let's add space covering requirements
+
+11
+00:00:45,680 --> 00:00:51,480
+Add that and for our floor let's do
+
+12
+00:00:53,599 --> 00:00:55,599
+Carpet one
+
+13
+00:00:55,600 --> 00:00:57,960
+For our walls
+
+14
+00:00:59,840 --> 00:01:05,040
+We'll do this so let me drag it out here or so
+
+15
+00:01:08,300 --> 00:01:12,280
+Adding that verbiage there and for the ceiling
+
+16
+00:01:15,280 --> 00:01:20,920
+Just gonna say see reflected ceiling plan there and then for the wall base
+
+17
+00:01:20,920 --> 00:01:26,080
+Or the skirting board rather I'm going to use that
+
+18
+00:01:27,480 --> 00:01:32,560
+So I'm gonna go through the rest of these spaces then and add those
+
+19
+00:01:33,080 --> 00:01:35,560
+parameters to the rest of them
+
+20
+00:01:36,240 --> 00:01:41,440
+so now that we went through all the spaces and added these property sets and
+
+21
+00:01:42,640 --> 00:01:44,560
+property values here
+
+22
+00:01:44,560 --> 00:01:48,200
+We can then create a simple room finish schedule
+
+23
+00:01:49,200 --> 00:01:51,200
+So that is done
+
+24
+00:01:51,480 --> 00:01:57,400
+At this tab here the quality and coordination tab and then the spreadsheet import export down here
+
+25
+00:01:57,840 --> 00:02:03,240
+and you want to load from memory, so it's loading that IFC that's in bonsai right now and
+
+26
+00:02:04,200 --> 00:02:08,080
+We're going to add a search group and yes, we want
+
+27
+00:02:08,759 --> 00:02:11,800
+the filter to be class and we're filtering for
+
+28
+00:02:12,960 --> 00:02:14,960
+IFC space
+
+29
+00:02:15,160 --> 00:02:16,760
+pulling out
+
+30
+00:02:16,760 --> 00:02:18,760
+All the information
+
+31
+00:02:20,280 --> 00:02:26,440
+From those IFC spaces, so if we just open this web UI click on that
+
+32
+00:02:31,519 --> 00:02:33,519
+It opens this browser-based
+
+33
+00:02:34,799 --> 00:02:42,760
+Table essentially for the spreadsheet so right now our room finish schedule is not very elaborate it only has the
+
+34
+00:02:43,560 --> 00:02:46,519
+Global ID of all the spaces so far
+
+35
+00:02:47,720 --> 00:02:50,079
+So let's start adding to that
+
+36
+00:02:51,239 --> 00:02:53,239
+we're going to add a
+
+37
+00:02:54,320 --> 00:02:58,799
+CSV attribute sometimes their attributes and sometimes their properties
+
+38
+00:02:59,920 --> 00:03:02,760
+In this case it's an attribute. We're gonna do
+
+39
+00:03:03,560 --> 00:03:05,359
+Just name
+
+40
+00:03:05,359 --> 00:03:08,840
+If you remember our name is actually the number of our spaces
+
+41
+00:03:08,840 --> 00:03:13,480
+So I'm gonna type in number in the second field is
+
+42
+00:03:14,280 --> 00:03:16,280
+Basically what you name the column
+
+43
+00:03:16,880 --> 00:03:20,560
+of that data, so we're gonna open the web UI again and
+
+44
+00:03:21,720 --> 00:03:29,460
+Here you can see your spreadsheet is starting to come together so on top of the header there. It says number
+
+45
+00:03:30,120 --> 00:03:32,480
+Then we have our numbers all in a row
+
+46
+00:03:36,040 --> 00:03:38,840
+We can add some more stuff how about
+
+47
+00:03:42,080 --> 00:03:44,080
+Long name
+
+48
+00:03:44,560 --> 00:03:46,560
+Just call it name
+
+49
+00:03:47,960 --> 00:03:49,960
+Let's we can
+
+50
+00:03:51,520 --> 00:03:53,520
+Add the
+
+51
+00:03:53,560 --> 00:03:55,560
+level that each
+
+52
+00:03:55,880 --> 00:03:57,680
+spaces in
+
+53
+00:03:57,680 --> 00:03:59,200
+by
+
+54
+00:03:59,200 --> 00:04:00,400
+using
+
+55
+00:04:00,400 --> 00:04:02,400
+the parent and
+
+56
+00:04:02,600 --> 00:04:04,520
+then dot name
+
+57
+00:04:04,520 --> 00:04:08,400
+Again when you want to find out where some of these values come from
+
+58
+00:04:08,400 --> 00:04:09,920
+You
+
+59
+00:04:09,920 --> 00:04:15,280
+go back to this selector syntax that I've brought up a number of times and
+
+60
+00:04:16,240 --> 00:04:20,720
+You can see if we use the parent key there
+
+61
+00:04:21,240 --> 00:04:24,200
+that it gets the parent element in the spatial hierarchy and
+
+62
+00:04:24,840 --> 00:04:27,700
+so you follow that then by a
+
+63
+00:04:28,220 --> 00:04:31,160
+Dot and it gets the name of that spatial hierarchy
+
+64
+00:04:32,000 --> 00:04:33,800
+So we'll just say
+
+65
+00:04:33,800 --> 00:04:35,800
+level then
+
+66
+00:04:35,800 --> 00:04:37,800
+I
+
+67
+00:04:37,960 --> 00:04:42,680
+What else we're gonna add how about we add some properties now
+
+68
+00:04:44,560 --> 00:04:47,220
+Click on that and we are going to
+
+69
+00:04:48,280 --> 00:04:52,680
+Add that occupancy type property that we added to the space
+
+70
+00:04:52,800 --> 00:04:56,720
+so that's the property set and then dot this is the property and
+
+71
+00:04:57,760 --> 00:05:00,400
+We're just going to name that column
+
+72
+00:05:02,020 --> 00:05:04,020
+Occupancy type
+
+73
+00:05:05,800 --> 00:05:12,400
+Let's actually just run it to see delete this run it to see what we got so far
+
+74
+00:05:15,880 --> 00:05:17,880
+So, yep looks like it's coming together
+
+75
+00:05:21,520 --> 00:05:25,300
+Let's add in the area of the space
+
+76
+00:05:31,440 --> 00:05:33,440
+Area
+
+77
+00:05:33,680 --> 00:05:34,920
+And
+
+78
+00:05:34,920 --> 00:05:36,920
+Run it again
+
+79
+00:05:37,120 --> 00:05:43,040
+Here it's added. You can tell that it's not rounded to the whole number so we can change that
+
+80
+00:05:46,040 --> 00:05:51,880
+Again if you go back to your selector syntax and search for rounds
+
+81
+00:05:55,040 --> 00:06:00,280
+Round you can kind of see the logic which you can use
+
+82
+00:06:03,480 --> 00:06:06,520
+So I'm just going to basically copy and paste
+
+83
+00:06:07,240 --> 00:06:11,400
+The logic that we need and you have to turn on this
+
+84
+00:06:12,160 --> 00:06:15,760
+or click this icon to turn on where to enter the
+
+85
+00:06:17,320 --> 00:06:19,920
+The values there to round the number
+
+86
+00:06:24,760 --> 00:06:26,760
+And that's what we're going to use there
+
+87
+00:06:28,960 --> 00:06:33,080
+Let us add in the floor covering and the wall covering
+
+88
+00:06:33,600 --> 00:06:35,600
+parameters
+
+89
+00:06:39,360 --> 00:06:41,360
+Open this up further
+
+90
+00:06:50,920 --> 00:06:56,240
+Flooring wall coverings
+
+91
+00:07:03,440 --> 00:07:05,440
+Ceiling
+
+92
+00:07:13,480 --> 00:07:15,480
+And then
+
+93
+00:07:17,520 --> 00:07:23,880
+Baseboard I just say base I guess let's do wall this one
+
+94
+00:07:26,320 --> 00:07:28,800
+And we'll run it again see what it looks like
+
+95
+00:07:28,800 --> 00:07:30,800
+All
+
+96
+00:07:31,840 --> 00:07:39,280
+Right starting to look like something so you can drag these open to get wider columns if you'd like
+
+97
+00:07:42,440 --> 00:07:48,400
+You're also in this view you can kind of sort quickly on certain things
+
+98
+00:07:49,960 --> 00:07:51,960
+Or you can filter
+
+99
+00:07:52,960 --> 00:07:58,960
+It's a first floor so just filters the first floor spaces
+
+100
+00:08:02,120 --> 00:08:06,280
+You can also make how this table is sorted a more permanent
+
+101
+00:08:07,680 --> 00:08:09,679
+fixture
+
+102
+00:08:09,960 --> 00:08:13,200
+And if you turn on the show sorting
+
+103
+00:08:14,560 --> 00:08:16,560
+Element there
+
+104
+00:08:16,880 --> 00:08:18,880
+You can say
+
+105
+00:08:19,600 --> 00:08:22,280
+You can tell it how to sort from here
+
+106
+00:08:22,960 --> 00:08:26,280
+So we can actually start with the highest number and go down
+
+107
+00:08:27,280 --> 00:08:29,280
+See what it looks like
+
+108
+00:08:34,960 --> 00:08:38,640
+Or we want to go the other direction ascending
+
+109
+00:08:42,760 --> 00:08:44,760
+There descends
+
+110
+00:08:45,200 --> 00:08:48,240
+So let's say we want to sort by
+
+111
+00:08:48,920 --> 00:08:51,439
+The accuracy type and then the number
+
+112
+00:08:53,480 --> 00:08:59,060
+The order of these values is that important so if we want to
+
+113
+00:09:01,640 --> 00:09:04,600
+Sort by the accuracy type we have to move it up
+
+114
+00:09:04,600 --> 00:09:06,600
+And
+
+115
+00:09:17,880 --> 00:09:19,880
+We want to
+
+116
+00:09:20,200 --> 00:09:25,320
+Sort by sending and then after that sort by the name or the number of the
+
+117
+00:09:26,880 --> 00:09:28,880
+Space
+
+118
+00:09:29,240 --> 00:09:35,760
+So here you can see it's organized by whether it's habitable or non habitable and then after that then it starts ordering
+
+119
+00:09:37,640 --> 00:09:39,640
+By the number
+
+120
+00:09:40,560 --> 00:09:46,560
+So instead of exporting it to that web-based viewer you can actually export out a
+
+121
+00:09:49,640 --> 00:09:55,120
+Excel or a CSV file or a open document file
+
+122
+00:09:56,120 --> 00:10:03,200
+You change that here and say we want to export an ODS file instead
+
+123
+00:10:04,920 --> 00:10:06,920
+Say export
+
+124
+00:10:07,920 --> 00:10:11,480
+And navigate to where we want it
+
+125
+00:10:19,640 --> 00:10:22,640
+Let's add a folder and say schedules
+
+126
+00:10:25,120 --> 00:10:27,120
+And
+
+127
+00:10:31,200 --> 00:10:33,200
+Let's say room finish
+
+128
+00:10:35,240 --> 00:10:41,600
+Schedule okay, then we're gonna navigate to that
+
+129
+00:10:43,360 --> 00:10:45,360
+To open it
+
+130
+00:10:55,120 --> 00:10:57,120
+So
+
+131
+00:11:09,040 --> 00:11:11,880
+Here it is in LibreCalc as well
+
+132
+00:11:14,280 --> 00:11:16,280
+So there's other
+
+133
+00:11:16,800 --> 00:11:18,960
+Aspects you can add to this you can
+
+134
+00:11:20,800 --> 00:11:22,800
+You click on that component
+
+135
+00:11:25,120 --> 00:11:27,120
+You can sum the values
+
+136
+00:11:27,520 --> 00:11:29,520
+Oh, I don't want to sum that
+
+137
+00:11:30,440 --> 00:11:33,440
+We want to sum of the the name or the number
+
+138
+00:11:34,600 --> 00:11:36,600
+See what happens
+
+139
+00:11:39,640 --> 00:11:42,680
+Let's replace that again set again
+
+140
+00:11:47,800 --> 00:11:51,000
+And see if we just open it recent see what changes
+
+141
+00:11:55,120 --> 00:11:57,120
+You
+
+142
+00:12:02,880 --> 00:12:06,480
+Yep there and added the sum of all those numbers
+
+143
+00:12:09,040 --> 00:12:13,120
+The other great features you can actually change the value here
+
+144
+00:12:13,640 --> 00:12:15,640
+so we can change the
+
+145
+00:12:15,680 --> 00:12:19,280
+Flooring in the primary bedroom to something was to say testing
+
+146
+00:12:20,040 --> 00:12:25,920
+Save it and then you can import that then back into the model if you go import type C
+
+147
+00:12:27,079 --> 00:12:29,079
+navigate to the file
+
+148
+00:12:30,000 --> 00:12:34,900
+Import and then if you select that space
+
+149
+00:12:37,199 --> 00:12:39,199
+Go back to properties
+
+150
+00:12:39,360 --> 00:12:43,339
+You can see that it's updated there with testing is the value
+
+151
+00:12:43,800 --> 00:12:47,920
+So very powerful if you got a lot of data that you need to wrangle
+
+152
+00:12:49,280 --> 00:12:51,680
+After spending so much time creating this schedule
+
+153
+00:12:52,400 --> 00:12:54,400
+Let's make sure we save it
+
+154
+00:12:55,420 --> 00:12:57,040
+externally in our
+
+155
+00:12:57,040 --> 00:13:01,220
+Repo directory so we then we if we need to run this schedule again
+
+156
+00:13:01,220 --> 00:13:04,720
+We can open it and so to do that you click on here
+
+157
+00:13:05,420 --> 00:13:06,640
+save
+
+158
+00:13:06,640 --> 00:13:11,920
+It's gonna save it as a JSON file. So navigate to where you want to be placed
+
+159
+00:13:13,000 --> 00:13:15,000
+and we're gonna say
+
+160
+00:13:16,800 --> 00:13:18,800
+Finish
+
+161
+00:13:19,280 --> 00:13:22,000
+You will save
+
+162
+00:13:29,319 --> 00:13:32,959
+So then if we want to let's actually delete all these
+
+163
+00:13:34,600 --> 00:13:39,720
+Later on load that file go back to it
+
+164
+00:13:42,000 --> 00:13:46,199
+And it should repopulate all the values there so you can run the schedule again
+
diff --git a/122000_20250520_1011 - Creating a custom property with a property template/122000_20250520_1011 - Creating a custom property with a property template.srt b/122000_20250520_1011 - Creating a custom property with a property template/122000_20250520_1011 - Creating a custom property with a property template.srt
new file mode 100644
index 0000000..a02db73
--- /dev/null
+++ b/122000_20250520_1011 - Creating a custom property with a property template/122000_20250520_1011 - Creating a custom property with a property template.srt
@@ -0,0 +1,304 @@
+1
+00:00:00,000 --> 00:00:06,000
+So as you probably saw, IFC comes with a lot of standard property sets that you can use.
+
+2
+00:00:06,000 --> 00:00:11,000
+And each property set has a bunch of properties underneath it.
+
+3
+00:00:11,000 --> 00:00:17,000
+But sometimes you'll get to a point where you need a certain property that's not in the standard list.
+
+4
+00:00:17,000 --> 00:00:20,000
+And you can ultimately create your own if you'd like.
+
+5
+00:00:20,000 --> 00:00:28,000
+And to do that, it's under the Project tab here and go down to Property Set Templates.
+
+6
+00:00:29,000 --> 00:00:38,000
+So to create a new one then, you click on this plus button here.
+
+7
+00:00:38,000 --> 00:00:49,000
+And we're going to call this one OD Property Template.
+
+8
+00:00:49,000 --> 00:00:52,000
+And say OK.
+
+9
+00:00:52,000 --> 00:00:57,000
+So we're going to name then the property set.
+
+10
+00:00:57,000 --> 00:01:01,000
+And for this we're going to do just OD Generic.
+
+11
+00:01:01,000 --> 00:01:05,000
+And description, you can add description if you want. I'm not going to do that.
+
+12
+00:01:05,000 --> 00:01:20,000
+So this template type then tells you how this particular property set applies to either the instance of an object or the type of an object.
+
+13
+00:01:20,000 --> 00:01:29,000
+So if we do this IFC object then, the properties will only apply to the instance and not the type.
+
+14
+00:01:29,000 --> 00:01:36,000
+If we do this Pset IFC Type Object, it means they will only apply to the type.
+
+15
+00:01:36,000 --> 00:01:43,000
+But if we do this IFC Type Object Override, it applies both to the instance and the type.
+
+16
+00:01:43,000 --> 00:01:52,000
+So if you assign a property at the instance level, then it will override whatever is applied at the type level.
+
+17
+00:01:52,000 --> 00:01:56,000
+So for this particular example, that's the one I'm going to use.
+
+18
+00:01:56,000 --> 00:02:01,000
+I won't cover these other ones. They apply to quantity sets.
+
+19
+00:02:01,000 --> 00:02:11,000
+The applicable entity kind of infers what class that this property set will apply to.
+
+20
+00:02:11,000 --> 00:02:17,000
+So you could put just IFC Wall in there if you wanted to and just have it specific to that.
+
+21
+00:02:17,000 --> 00:02:24,000
+But I'm going to use this to fall here where it's going to apply to all the types and all the instances.
+
+22
+00:02:24,000 --> 00:02:27,000
+Basically in the entire schema.
+
+23
+00:02:27,000 --> 00:02:31,000
+So it creates kind of a starter property here.
+
+24
+00:02:31,000 --> 00:02:36,000
+And if I edit that, you can name the property.
+
+25
+00:02:36,000 --> 00:02:43,000
+I'm just going to do comments instance.
+
+26
+00:02:43,000 --> 00:02:49,000
+And then the second field is the description. I'm just going to keep that blank.
+
+27
+00:02:49,000 --> 00:02:55,000
+So this next one then is the kind of primary measure type.
+
+28
+00:02:55,000 --> 00:03:00,000
+And I'll open it here. You can see all the available options.
+
+29
+00:03:00,000 --> 00:03:07,000
+You can measure for mass or power ratio or any number of measurements.
+
+30
+00:03:07,000 --> 00:03:13,000
+But for this example, I'm just going to do a simple IFC text.
+
+31
+00:03:13,000 --> 00:03:18,000
+And then under here, we're just going to do a single value.
+
+32
+00:03:18,000 --> 00:03:38,000
+But know that you can have a numerated list of preset values or bounded where maybe a temperature is going to be between five degrees or thirty five degrees or structural loading maybe.
+
+33
+00:03:38,000 --> 00:03:46,000
+So I won't get into the rest of these, but know that there's just other ways to formulate your data.
+
+34
+00:03:46,000 --> 00:03:50,000
+So we'll say OK there.
+
+35
+00:03:50,000 --> 00:03:57,000
+So to figure out where this was saved.
+
+36
+00:03:57,000 --> 00:04:02,000
+So you can use it later as you click on that folder there.
+
+37
+00:04:02,000 --> 00:04:10,000
+And you can see that it's located at this path right there.
+
+38
+00:04:10,000 --> 00:04:22,000
+So every time you start a Bonsai session or start Blender, it will look in this folder for this pset here or whatever number of psets you have.
+
+39
+00:04:22,000 --> 00:04:29,000
+And they will be made available to the project that you're working on currently.
+
+40
+00:04:29,000 --> 00:04:39,000
+But if you're working with multiple people, you then have to share this file with them to place in their corresponding location.
+
+41
+00:04:39,000 --> 00:04:47,000
+The one approach I like to do is actually put this pset in the project folder itself.
+
+42
+00:04:47,000 --> 00:04:55,000
+And so when you sync the entire repo, that pset is made available to that person.
+
+43
+00:04:55,000 --> 00:05:00,000
+So I'm going to cut this or copy it.
+
+44
+00:05:00,000 --> 00:05:03,000
+And I'm going to place it in the project folder.
+
+45
+00:05:04,000 --> 00:05:11,000
+And we're going to create a new folder called psets.
+
+46
+00:05:21,000 --> 00:05:24,000
+And we're going to paste it in there.
+
+47
+00:05:24,000 --> 00:05:29,000
+So we removed it from here and then we added it here.
+
+48
+00:05:29,000 --> 00:05:35,000
+So if you then open this file anew,
+
+49
+00:05:40,000 --> 00:05:46,000
+and go down to your project templates here, it should be listed here.
+
+50
+00:05:51,000 --> 00:05:53,000
+Listed here.
+
+51
+00:06:00,000 --> 00:06:12,000
+What we found with using these custom psets is that they are useful enough to be used across projects, not just specific projects.
+
+52
+00:06:12,000 --> 00:06:20,000
+So what we like to do is create a Git submodule with our psets that we use a lot,
+
+53
+00:06:20,000 --> 00:06:26,000
+and sync them into our individual project repros so that they're available to the actual project.
+
+54
+00:06:26,000 --> 00:06:38,000
+So similar to how we created that OD texture repo, and we pulled it into the project, we do that same thing with psets.
+
+55
+00:06:38,000 --> 00:06:50,000
+And so we've created a pset repo here with some of the property sets that we find useful for our projects.
+
+56
+00:06:50,000 --> 00:07:00,000
+So let's actually just sync this repo as a Git module into our project folder.
+
+57
+00:07:00,000 --> 00:07:08,000
+So as kind of a recap, we did this with OD textures, but as a recap, copy that path there,
+
+58
+00:07:08,000 --> 00:07:11,000
+and then go to your Git client.
+
+59
+00:07:11,000 --> 00:07:17,000
+And we are going to add a new submodule.
+
+60
+00:07:18,000 --> 00:07:30,000
+Paste the path there, and the directory we want, we want that directory, but before we actually do that,
+
+61
+00:07:30,000 --> 00:07:43,000
+let's go back to our folder here, and we're going to just delete this that we just created.
+
+62
+00:07:44,000 --> 00:07:51,000
+And so now we're going to create the submodule.
+
+63
+00:07:54,000 --> 00:08:02,000
+So it automatically stages in the pset submodule there, and then we'll just write a little commit message,
+
+64
+00:08:02,000 --> 00:08:09,000
+added psets, Git submodule, and so we can commit that locally.
+
+65
+00:08:10,000 --> 00:08:21,000
+So now if we go back to Bonsai and reload the file, and go to property templates here,
+
+66
+00:08:21,000 --> 00:08:35,000
+and switch this to property template, so you'll see there's a number of psets that we've created in the past.
+
+67
+00:08:35,000 --> 00:08:43,000
+And here you can see the comments instance is the one property that we created just a few minutes ago.
+
+68
+00:08:43,000 --> 00:08:47,000
+And there's some other ones that we find useful as well.
+
+69
+00:08:47,000 --> 00:08:56,000
+So we then can apply that property to the space, one of these spaces, just to test it out.
+
+70
+00:08:56,000 --> 00:09:09,000
+Select the space, select all the same class, and then isolate it, and let's pick that primary bedroom again.
+
+71
+00:09:10,000 --> 00:09:24,000
+Then go to the objects property, and we are going to add the OD generic pset, generic pset.
+
+72
+00:09:30,000 --> 00:09:35,000
+And say testing, instant comment testing, ok.
+
+73
+00:09:36,000 --> 00:09:46,000
+So then we can go back to our room finish schedule that we did the last video, and load that.
+
+74
+00:09:46,000 --> 00:10:05,000
+We can add another field here, where's the OD generic pset, and then the comments instance there, the property.
+
+75
+00:10:05,000 --> 00:10:24,000
+And just say, oops, comments, and we'll open it with the web there, and hopefully it adds that comment to the table.
+
+76
+00:10:24,000 --> 00:10:27,000
+So there, it added it right there.
+
diff --git a/123000_20250522_1356 - More about schedules/123000_20250522_1356 - More about schedules.srt b/123000_20250522_1356 - More about schedules/123000_20250522_1356 - More about schedules.srt
new file mode 100644
index 0000000..fdb58e5
--- /dev/null
+++ b/123000_20250522_1356 - More about schedules/123000_20250522_1356 - More about schedules.srt
@@ -0,0 +1,640 @@
+1
+00:00:00,000 --> 00:00:03,760
+So a few other things about spreadsheets.
+
+2
+00:00:03,760 --> 00:00:06,220
+You can.
+
+3
+00:00:06,220 --> 00:00:08,740
+Turn off the global ID if you'd like.
+
+4
+00:00:08,740 --> 00:00:10,920
+A lot of times you don't want that
+
+5
+00:00:10,920 --> 00:00:12,980
+in your tables or schedules when
+
+6
+00:00:12,980 --> 00:00:15,140
+you put them on your drawings.
+
+7
+00:00:15,140 --> 00:00:17,660
+So to turn them off.
+
+8
+00:00:17,660 --> 00:00:20,520
+You can just unclick that.
+
+9
+00:00:20,520 --> 00:00:21,040
+Run it.
+
+10
+00:00:24,220 --> 00:00:25,140
+Close this.
+
+11
+00:00:28,120 --> 00:00:28,980
+Open it again.
+
+12
+00:00:31,000 --> 00:00:33,280
+And so they're gone there.
+
+13
+00:00:33,280 --> 00:00:34,960
+One word of warning though.
+
+14
+00:00:34,960 --> 00:00:37,920
+If you are using.
+
+15
+00:00:37,920 --> 00:00:39,660
+This table.
+
+16
+00:00:39,660 --> 00:00:41,840
+In Excel or wherever and you're
+
+17
+00:00:41,840 --> 00:00:44,040
+changing these values and you want
+
+18
+00:00:44,040 --> 00:00:46,400
+to import that back into bonsai,
+
+19
+00:00:46,400 --> 00:00:49,000
+it's not going to work without the.
+
+20
+00:00:49,000 --> 00:00:51,540
+Global IDs, so you need those.
+
+21
+00:00:55,820 --> 00:00:57,240
+So if you.
+
+22
+00:00:58,240 --> 00:01:00,320
+Format your.
+
+23
+00:01:00,320 --> 00:01:01,400
+Schedule.
+
+24
+00:01:01,400 --> 00:01:05,160
+So it's nice and pretty and you got all your.
+
+25
+00:01:05,160 --> 00:01:07,160
+Tables how you'd like them.
+
+26
+00:01:07,160 --> 00:01:09,640
+And then you ultimately save it.
+
+27
+00:01:09,640 --> 00:01:11,120
+If you later.
+
+28
+00:01:11,120 --> 00:01:14,220
+Add some new property or whatever and
+
+29
+00:01:14,220 --> 00:01:18,320
+you want to rerun that schedule without.
+
+30
+00:01:18,320 --> 00:01:21,640
+Messing up the formatting that you just did.
+
+31
+00:01:21,640 --> 00:01:25,080
+You can use this preserve existing.
+
+32
+00:01:26,080 --> 00:01:28,720
+And that will preserve the formatting.
+
+33
+00:01:28,720 --> 00:01:29,440
+But try that.
+
+34
+00:01:36,200 --> 00:01:38,640
+So there we reran it and the
+
+35
+00:01:38,640 --> 00:01:40,520
+formatting stays the same.
+
+36
+00:01:43,759 --> 00:01:45,960
+You'll notice when there's a null value,
+
+37
+00:01:45,960 --> 00:01:48,080
+it puts an NA there.
+
+38
+00:01:48,080 --> 00:01:50,240
+If you don't necessarily like
+
+39
+00:01:50,240 --> 00:01:52,520
+that approach or format.
+
+40
+00:01:52,520 --> 00:01:54,500
+You can change it here.
+
+41
+00:01:54,500 --> 00:01:56,020
+I like to just use a dash.
+
+42
+00:02:10,900 --> 00:02:12,860
+So there's this generate SVG,
+
+43
+00:02:12,860 --> 00:02:15,020
+which is nice in concept,
+
+44
+00:02:15,020 --> 00:02:18,140
+but I don't think it works 100%.
+
+45
+00:02:18,140 --> 00:02:22,340
+It's supposed to when you export out the table.
+
+46
+00:02:22,820 --> 00:02:25,260
+It should create the SVG at the same time,
+
+47
+00:02:25,260 --> 00:02:27,380
+but the formatting is kind of wonky,
+
+48
+00:02:27,380 --> 00:02:29,700
+so I wouldn't necessarily use it.
+
+49
+00:02:29,700 --> 00:02:31,740
+Formatting is kind of wonky,
+
+50
+00:02:31,740 --> 00:02:34,900
+so I wouldn't necessarily use it.
+
+51
+00:02:34,900 --> 00:02:35,940
+At this point.
+
+52
+00:02:35,940 --> 00:02:39,740
+Let's create another schedule door schedule.
+
+53
+00:02:39,740 --> 00:02:41,660
+Let's just delete these.
+
+54
+00:02:45,780 --> 00:02:49,220
+Start a new. Reset that.
+
+55
+00:02:49,220 --> 00:02:51,900
+I'll put that back to web.
+
+56
+00:02:51,900 --> 00:02:53,460
+And instead of spaces,
+
+57
+00:02:53,460 --> 00:02:55,380
+we're going to do doors.
+
+58
+00:02:55,380 --> 00:02:59,060
+I see door. And.
+
+59
+00:03:01,980 --> 00:03:04,780
+Open this up a little more.
+
+60
+00:03:04,780 --> 00:03:06,220
+Open web UI.
+
+61
+00:03:14,340 --> 00:03:16,660
+OK, so we have our.
+
+62
+00:03:16,660 --> 00:03:19,420
+Global IDs to start.
+
+63
+00:03:19,420 --> 00:03:21,339
+So let's first put in.
+
+64
+00:03:27,779 --> 00:03:34,459
+Type. Name. So this basically.
+
+65
+00:03:34,459 --> 00:03:38,220
+Is the instance types name?
+
+66
+00:03:38,220 --> 00:03:40,260
+That we want and we're just
+
+67
+00:03:40,260 --> 00:03:43,779
+going to do a type. Mark here.
+
+68
+00:03:43,780 --> 00:03:49,740
+And we'll run it, see what happens.
+
+69
+00:03:52,220 --> 00:03:55,420
+Alright, so you can see in the browser
+
+70
+00:03:55,420 --> 00:03:59,300
+here that it's listing all the instances.
+
+71
+00:03:59,300 --> 00:04:01,820
+But let's say we just want a
+
+72
+00:04:01,820 --> 00:04:03,700
+spreadsheet that just lists the
+
+73
+00:04:03,700 --> 00:04:06,320
+type and then we want to.
+
+74
+00:04:06,320 --> 00:04:07,980
+Later add the counter.
+
+75
+00:04:07,980 --> 00:04:11,220
+The number of instances of that type.
+
+76
+00:04:11,220 --> 00:04:12,820
+So to start.
+
+77
+00:04:12,859 --> 00:04:15,780
+We're going to activate this.
+
+78
+00:04:15,780 --> 00:04:17,579
+Showing group tab there.
+
+79
+00:04:17,579 --> 00:04:20,500
+And we're going to switch it to
+
+80
+00:04:20,500 --> 00:04:22,860
+group and then run it again.
+
+81
+00:04:22,860 --> 00:04:25,380
+So you see it all consolidated all
+
+82
+00:04:25,380 --> 00:04:27,420
+those instances down to basically
+
+83
+00:04:27,420 --> 00:04:29,780
+just the types in the project.
+
+84
+00:04:29,780 --> 00:04:32,420
+There's one type in the project
+
+85
+00:04:32,420 --> 00:04:34,900
+here that looks like it's.
+
+86
+00:04:34,900 --> 00:04:37,500
+There's no instance in.
+
+87
+00:04:37,500 --> 00:04:38,700
+The actual model,
+
+88
+00:04:38,700 --> 00:04:41,100
+but we'll address that later.
+
+89
+00:04:41,100 --> 00:04:46,860
+So. The other attribute let's do type.
+
+90
+00:04:46,860 --> 00:04:50,660
+That description.
+
+91
+00:04:50,660 --> 00:04:54,140
+So it's taking the instance types
+
+92
+00:04:54,140 --> 00:04:57,300
+description. Annual just say type.
+
+93
+00:05:00,740 --> 00:05:01,620
+And run it again.
+
+94
+00:05:07,700 --> 00:05:11,020
+OK, so let's.
+
+95
+00:05:11,620 --> 00:05:14,340
+Add now the count.
+
+96
+00:05:14,340 --> 00:05:17,460
+So we want instance type count.
+
+97
+00:05:21,260 --> 00:05:23,060
+This is just say count.
+
+98
+00:05:25,420 --> 00:05:26,180
+And then run it.
+
+99
+00:05:29,180 --> 00:05:33,860
+So here it just has 111.
+
+100
+00:05:33,860 --> 00:05:35,300
+We need to.
+
+101
+00:05:35,300 --> 00:05:39,340
+I think it's just it's counting.
+
+102
+00:05:39,380 --> 00:05:40,900
+The types, I believe,
+
+103
+00:05:40,900 --> 00:05:45,659
+so we want to actually switch this to sum.
+
+104
+00:05:45,659 --> 00:05:48,260
+And now run it.
+
+105
+00:05:48,260 --> 00:05:51,340
+And so yes, now the counts there.
+
+106
+00:05:51,340 --> 00:05:52,859
+This decimal it shows up
+
+107
+00:05:52,859 --> 00:05:54,020
+as a decimal in the web,
+
+108
+00:05:54,020 --> 00:05:56,460
+but if you export out to.
+
+109
+00:05:56,460 --> 00:05:58,780
+Open office, it's a whole number.
+
+110
+00:05:58,780 --> 00:06:01,739
+Let's just so you know.
+
+111
+00:06:01,739 --> 00:06:04,580
+The other last part is.
+
+112
+00:06:04,580 --> 00:06:08,419
+In order to get rid of the.
+
+113
+00:06:08,460 --> 00:06:10,140
+Types that are not instantiated
+
+114
+00:06:10,140 --> 00:06:12,340
+or in actually in the model.
+
+115
+00:06:12,340 --> 00:06:14,100
+There's a step.
+
+116
+00:06:14,100 --> 00:06:17,700
+You take which is not 100% clear.
+
+117
+00:06:17,700 --> 00:06:21,820
+But it works is to add a query.
+
+118
+00:06:21,820 --> 00:06:24,340
+This is the query here.
+
+119
+00:06:24,340 --> 00:06:29,020
+And we want to go type dot count.
+
+120
+00:06:32,020 --> 00:06:35,700
+One. So it's basically saying
+
+121
+00:06:35,740 --> 00:06:39,020
+we're looking for at least.
+
+122
+00:06:39,020 --> 00:06:40,539
+One instance in the model,
+
+123
+00:06:40,539 --> 00:06:41,740
+and if it doesn't have that,
+
+124
+00:06:41,740 --> 00:06:43,780
+it's not going to show it so we can
+
+125
+00:06:43,780 --> 00:06:45,460
+refresh it and see what it looks like.
+
+126
+00:06:45,460 --> 00:06:47,740
+So there I got rid of that.
+
+127
+00:06:47,740 --> 00:06:49,940
+Unused type.
+
+128
+00:06:49,940 --> 00:06:50,860
+So after you're done,
+
+129
+00:06:50,860 --> 00:06:53,900
+then you can. Save it out.
+
+130
+00:06:53,900 --> 00:06:56,300
+Overwrite the door schedule simple there.
+
+131
+00:06:58,900 --> 00:07:00,900
+You know some other schedules as well
+
+132
+00:07:00,900 --> 00:07:03,700
+that I've been working on in the meantime.
+
+133
+00:07:03,740 --> 00:07:05,740
+I'll open this coverings one.
+
+134
+00:07:07,940 --> 00:07:11,260
+Switches to the web.
+
+135
+00:07:11,260 --> 00:07:14,940
+And run it. So here it's using the same
+
+136
+00:07:14,940 --> 00:07:17,219
+kind of logic as the door schedule.
+
+137
+00:07:17,219 --> 00:07:19,099
+You get the type name, the description.
+
+138
+00:07:22,340 --> 00:07:23,980
+Open up this actually I just.
+
+139
+00:07:27,500 --> 00:07:29,860
+I'm pulling out quantities,
+
+140
+00:07:29,860 --> 00:07:33,260
+the area. And then the layers.
+
+141
+00:07:33,260 --> 00:07:36,380
+The first layer in the second layer.
+
+142
+00:07:36,380 --> 00:07:36,820
+There.
+
+143
+00:07:42,180 --> 00:07:43,340
+Open up another one.
+
+144
+00:07:47,980 --> 00:07:48,780
+Slabs.
+
+145
+00:07:51,180 --> 00:07:53,340
+The same concept pulling in the
+
+146
+00:07:53,340 --> 00:07:55,900
+properties and the material layers.
+
+147
+00:07:55,900 --> 00:08:03,780
+Run that. Oops. Search it to web.
+
+148
+00:08:09,500 --> 00:08:14,460
+And. Windows schedule same thing.
+
+149
+00:08:20,700 --> 00:08:23,700
+And here I didn't use the trick.
+
+150
+00:08:23,700 --> 00:08:26,620
+Let's do type count.
+
+151
+00:08:29,300 --> 00:08:32,340
+One. And run it.
+
+152
+00:08:32,340 --> 00:08:35,059
+OK, there you got rid of the type.
+
+153
+00:08:35,059 --> 00:08:37,700
+And save it out then.
+
+154
+00:08:37,700 --> 00:08:39,220
+Window schedule save.
+
+155
+00:08:42,059 --> 00:08:47,620
+So I put these I ran these schedules.
+
+156
+00:08:47,620 --> 00:08:51,060
+In our drawings tab you see down here.
+
+157
+00:08:51,099 --> 00:08:54,380
+And I placed them all on a sheet.
+
+158
+00:08:54,380 --> 00:08:57,180
+So a 900 sheet there.
+
+159
+00:08:57,180 --> 00:08:58,180
+We can just look at it.
+
+160
+00:09:04,300 --> 00:09:05,660
+So they're placed on the sheet.
+
diff --git a/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls.srt b/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls.srt
new file mode 100644
index 0000000..0d36cef
--- /dev/null
+++ b/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls.srt
@@ -0,0 +1,284 @@
+1
+00:00:00,000 --> 00:00:05,600
+So as you probably saw in that last commit, there was quite a number of changes done to the model.
+
+2
+00:00:06,720 --> 00:00:12,560
+I put in a lot of entourage and a lot of finishes, IFC coverings.
+
+3
+00:00:13,680 --> 00:00:23,120
+So there is a tool, Integral to Bonsai, that allows you to visualize
+
+4
+00:00:23,360 --> 00:00:30,720
+the changes in the model since the last time you committed the model to Git.
+
+5
+00:00:30,720 --> 00:00:35,840
+So we're using Git to track the versions of this model.
+
+6
+00:00:35,840 --> 00:00:39,120
+So this tool allows us then to see those changes.
+
+7
+00:00:39,120 --> 00:00:44,640
+So this tool is pretty powerful. There's more that you can do with it,
+
+8
+00:00:44,640 --> 00:00:52,000
+but I just want to show a quick visual on how to see the changes in the model since the last
+
+9
+00:00:52,240 --> 00:00:59,760
+model change. So it's located here under Project Overview under this Git here,
+
+10
+00:00:59,760 --> 00:01:08,240
+and we're just going to refresh. So here is all the commits throughout history here,
+
+11
+00:01:10,800 --> 00:01:18,480
+and the dates and whatnot. So we want to just click the last commit and hit the button here.
+
+12
+00:01:19,120 --> 00:01:22,560
+This colorize objects by selected revision.
+
+13
+00:01:26,160 --> 00:01:32,960
+And what that does is colorize based on the actual change.
+
+14
+00:01:32,960 --> 00:01:42,160
+So the blue colors are those objects that are existing but have changed in one way or the other,
+
+15
+00:01:42,160 --> 00:01:48,399
+whether it be geometry or whether it be the data in the actual object.
+
+16
+00:01:49,119 --> 00:01:54,080
+So a lot of these blue changes here are probably because when I was working on the schedules,
+
+17
+00:01:55,360 --> 00:01:57,840
+I added a lot more information to the objects.
+
+18
+00:01:59,120 --> 00:02:05,440
+So unfortunately there's no button yet to select those objects that are blue.
+
+19
+00:02:06,399 --> 00:02:13,040
+I just wrote a or ChatGPT wrote a quick script that selects the same colors,
+
+20
+00:02:13,040 --> 00:02:17,600
+and so I'm just going to isolate that.
+
+21
+00:02:21,040 --> 00:02:25,120
+So again, these are the existing objects that have changed in some way.
+
+22
+00:02:26,720 --> 00:02:30,560
+So I'm just going to move back and I'm going to select the green.
+
+23
+00:02:31,200 --> 00:02:37,280
+The green is new objects, totally new relative to the last commit.
+
+24
+00:02:38,560 --> 00:02:41,040
+So I'll select those and isolate them.
+
+25
+00:02:43,280 --> 00:02:48,880
+I'll turn on the material preview to see what's going on here.
+
+26
+00:02:48,880 --> 00:02:54,720
+So like I said, I added a bunch of flooring materials, tile, carpet, LVT.
+
+27
+00:02:55,600 --> 00:03:01,440
+I added a bunch of furniture, and these are all types that I pulled in from other projects.
+
+28
+00:03:03,040 --> 00:03:05,120
+There's nothing special really about them.
+
+29
+00:03:06,560 --> 00:03:10,480
+The flooring is just horizontal layers.
+
+30
+00:03:10,480 --> 00:03:14,960
+It has a profile if you tab into it.
+
+31
+00:03:15,840 --> 00:03:19,040
+The tile is a vertical layer.
+
+32
+00:03:19,040 --> 00:03:20,800
+It acts like a wall.
+
+33
+00:03:21,680 --> 00:03:26,400
+The cabinets here are kind of just generic massing cabinets.
+
+34
+00:03:26,400 --> 00:03:29,440
+They're actually extruded profiles if I tab into them.
+
+35
+00:03:30,640 --> 00:03:31,840
+You see the profile there.
+
+36
+00:03:33,120 --> 00:03:40,960
+You can actually set the cursor and do a shift E to extend these cabinets.
+
+37
+00:03:41,920 --> 00:03:45,200
+Just kind of nice when you're in the early stages of design.
+
+38
+00:03:45,200 --> 00:03:48,959
+What else?
+
+39
+00:03:48,959 --> 00:04:01,200
+So I used a tool to place this IFC covering, which is a floor obviously, that you can select
+
+40
+00:04:01,200 --> 00:04:11,440
+all the enclosing walls and the tool will automatically do an outline of the flooring.
+
+41
+00:04:11,600 --> 00:04:19,200
+Tool will automatically do an outline of the flooring profile so I can show you how to do that.
+
+42
+00:04:20,560 --> 00:04:22,640
+So let's go to the second floor.
+
+43
+00:04:26,320 --> 00:04:27,200
+Activate that.
+
+44
+00:04:34,800 --> 00:04:35,280
+Zoom in.
+
+45
+00:04:36,080 --> 00:04:40,640
+I'm going to just move this existing floor out of the way, the time being.
+
+46
+00:04:42,400 --> 00:04:48,080
+Let's select all the walls and isolate them.
+
+47
+00:04:52,880 --> 00:04:58,880
+Go to this tool here, the IFC covering tool, and we're going to do LVT2.
+
+48
+00:05:00,560 --> 00:05:04,320
+I'm going to open the tool, close this down a little bit.
+
+49
+00:05:04,400 --> 00:05:12,880
+We want to select those walls that you want to bound the space and then add flooring from the
+
+50
+00:05:12,880 --> 00:05:13,380
+walls.
+
+51
+00:05:15,520 --> 00:05:16,000
+Hopefully.
+
+52
+00:05:21,360 --> 00:05:22,000
+There we go.
+
+53
+00:05:23,360 --> 00:05:29,520
+So unfortunately, this tool has a little quirk in it right now where the boundary doesn't go
+
+54
+00:05:29,520 --> 00:05:31,280
+up tight to the wall.
+
+55
+00:05:31,280 --> 00:05:33,280
+There's a slight offset.
+
+56
+00:05:34,719 --> 00:05:36,080
+There's a bug report.
+
+57
+00:05:36,080 --> 00:05:38,960
+Hopefully that'll be rectified soon.
+
+58
+00:05:39,760 --> 00:05:45,120
+But for the time being, if this happens to you, you can use the measure tool here just
+
+59
+00:05:45,120 --> 00:05:46,880
+to see how far it's off.
+
+60
+00:05:48,479 --> 00:05:51,039
+So one and three sixteenths inches.
+
+61
+00:05:51,919 --> 00:05:56,719
+So if we tab into it, select the profile.
+
+62
+00:05:57,360 --> 00:06:01,520
+Select the profile, do this offset.
+
+63
+00:06:03,520 --> 00:06:08,720
+We'll do one inch plus three sixteenths inches.
+
+64
+00:06:12,160 --> 00:06:15,520
+And then we'll select that other one, control L and then delete.
+
+65
+00:06:16,960 --> 00:06:18,000
+And then tab out of it.
+
+66
+00:06:20,720 --> 00:06:21,360
+And there we go.
+
+67
+00:06:21,760 --> 00:06:25,760
+I believe we'll see if you move one of these walls here.
+
+68
+00:06:28,960 --> 00:06:29,840
+And regenerate.
+
+69
+00:06:30,720 --> 00:06:34,160
+It should, hopefully, we shall see.
+
+70
+00:06:36,720 --> 00:06:39,120
+I hope it does not shift G.
+
+71
+00:06:40,320 --> 00:06:41,760
+Oh, well, maybe in the future.
+
diff --git a/125000_20250522_1658 - Modifying title sheets and drawing titles/125000_20250522_1658 - Modifying title sheets and drawing titles.srt b/125000_20250522_1658 - Modifying title sheets and drawing titles/125000_20250522_1658 - Modifying title sheets and drawing titles.srt
new file mode 100644
index 0000000..2046c26
--- /dev/null
+++ b/125000_20250522_1658 - Modifying title sheets and drawing titles/125000_20250522_1658 - Modifying title sheets and drawing titles.srt
@@ -0,0 +1,288 @@
+1
+00:00:00,000 --> 00:00:05,840
+So let's talk about working with sheets. Let's run this basement plan. Do control
+
+2
+00:00:05,840 --> 00:00:13,840
+click on that. Open it up in the browser. We can scroll down here. You can see that
+
+3
+00:00:13,840 --> 00:00:18,480
+there are certain fields that get populated with data from the actual
+
+4
+00:00:18,480 --> 00:00:23,760
+sheet. So this is the sheet name, the sheet identification, or the number, and
+
+5
+00:00:24,160 --> 00:00:31,920
+and then the revision date. There isn't anything, no revision yet associated with this sheet.
+
+6
+00:00:32,560 --> 00:00:41,120
+You can also add more other fields to this sheet and I can show you how to do that.
+
+7
+00:00:42,160 --> 00:00:48,800
+So first we're going to click on that which is the sheet template essentially
+
+8
+00:00:49,360 --> 00:00:52,400
+and we're going to open that in Inkscape as well.
+
+9
+00:00:56,080 --> 00:00:57,280
+If we scroll down here,
+
+10
+00:00:59,599 --> 00:01:06,479
+you can see the various fields that are being used surrounded by the double curly brackets there.
+
+11
+00:01:07,840 --> 00:01:18,240
+So there are other data points you can pull from a sheet as well and to find those
+
+12
+00:01:18,960 --> 00:01:20,160
+they're somewhat hidden.
+
+13
+00:01:22,320 --> 00:01:27,440
+You go down to your project setup and go to documents and open that
+
+14
+00:01:31,920 --> 00:01:36,000
+and scroll until you find the sheet. So we'll go to the basement here.
+
+15
+00:01:36,000 --> 00:01:42,880
+Select that and do the pencil icon to see the fields that are associated with that sheet.
+
+16
+00:01:43,679 --> 00:01:47,200
+And so here you can see the ones that are already associated with the sheet,
+
+17
+00:01:47,200 --> 00:01:48,480
+the identification, the name,
+
+18
+00:01:52,560 --> 00:01:58,080
+and I believe the revision is there but it doesn't have any data of course.
+
+19
+00:01:58,720 --> 00:02:08,960
+So let's say we want to add this purpose field here. Let's just populate it to do something.
+
+20
+00:02:11,680 --> 00:02:13,360
+And we're just going to save that.
+
+21
+00:02:13,360 --> 00:02:18,800
+We go back to Inkscape,
+
+22
+00:02:21,680 --> 00:02:27,440
+double click to get in that group and copy paste that just to make another one.
+
+23
+00:02:29,680 --> 00:02:31,360
+And we're going to change this to purpose.
+
+24
+00:02:35,520 --> 00:02:36,400
+I'm going to save it
+
+25
+00:02:37,360 --> 00:02:42,240
+and go back to the drawing.
+
+26
+00:02:49,120 --> 00:02:59,840
+And let's run this drawing to see if our purpose has been fulfilled. Yes it has to do something.
+
+27
+00:02:59,840 --> 00:03:09,760
+So obviously this is a default title sheet that comes with the demo
+
+28
+00:03:10,640 --> 00:03:15,040
+and you'll probably want to create your own after a while.
+
+29
+00:03:17,120 --> 00:03:22,080
+It's relatively easy if you know how to use Inkscape or Illustrator.
+
+30
+00:03:22,720 --> 00:03:29,840
+It's you can compose your own. It's all vector based lines and fill patterns and text and whatnot.
+
+31
+00:03:30,560 --> 00:03:42,000
+And so we have created our own and it is in layouts, title blocks,
+
+32
+00:03:44,480 --> 00:03:47,840
+and I'll open this one just so you can see.
+
+33
+00:03:52,400 --> 00:04:00,320
+So yeah just added logo, address. These are the fields I was telling you about
+
+34
+00:04:01,360 --> 00:04:10,320
+before just in different fonts. This is specific to every project we fill in.
+
+35
+00:04:11,600 --> 00:04:17,440
+We actually put the date here in the SVG file versus trying to pull it from
+
+36
+00:04:18,320 --> 00:04:22,960
+the model which you don't necessarily have to. You could pull that information
+
+37
+00:04:25,520 --> 00:04:32,800
+from the IFC file if you'd like. So once you have your kind of SVG title sheet
+
+38
+00:04:33,600 --> 00:04:39,120
+done and composed then you can go back to your drawings and switch it out.
+
+39
+00:04:39,120 --> 00:04:49,680
+So you select the title sheet, hit edit, and we're going to use the 22 by 34 and say okay.
+
+40
+00:04:51,200 --> 00:04:55,680
+And so now if we run the drawing hopefully we'll have a new title block with it.
+
+41
+00:04:58,960 --> 00:04:59,440
+There we go.
+
+42
+00:04:59,440 --> 00:05:07,280
+So you can also customize this view title here or the drawing title. So that is located
+
+43
+00:05:08,880 --> 00:05:15,280
+in layouts, assets, and then this view title here. If you open that in Inkscape.
+
+44
+00:05:19,280 --> 00:05:20,320
+So just like the
+
+45
+00:05:20,320 --> 00:05:26,960
+sheet you can change the colors, modify this to your liking, change the fonts I believe too.
+
+46
+00:05:29,920 --> 00:05:34,080
+So you can also pull in
+
+47
+00:05:36,480 --> 00:05:41,200
+sheet information as well into this drawing. And the
+
+48
+00:05:41,200 --> 00:05:50,240
+approach to use is to preface it with the sheet and then with the value that you're looking for.
+
+49
+00:05:50,240 --> 00:05:58,800
+So we're going to say identification. So that's going to pull the sheet number
+
+50
+00:05:58,800 --> 00:06:05,039
+from the model to the title sheet. So that's going to be the sheet number
+
+51
+00:06:05,040 --> 00:06:14,400
+identification. So that's going to pull the sheet number out that this drawing is on.
+
+52
+00:06:15,280 --> 00:06:17,840
+So actually do another one here.
+
+53
+00:06:21,520 --> 00:06:28,800
+And we're going to say sheet purpose as well. So let's save that.
+
+54
+00:06:29,040 --> 00:06:34,080
+I'm going to go back to bonsai and rerun basement and see what happens.
+
+55
+00:06:37,280 --> 00:06:44,480
+Oh there we go. See it has the A100 sheet on there and then it has our purpose to do something.
+
+56
+00:06:48,960 --> 00:06:50,800
+So you can combine the values too.
+
+57
+00:06:52,960 --> 00:06:53,920
+Let's try this.
+
+58
+00:06:54,240 --> 00:06:54,880
+Try this.
+
+59
+00:06:57,360 --> 00:06:58,960
+I'm going to copy that.
+
+60
+00:07:01,520 --> 00:07:08,640
+And I'm going to put that in front and just separate it with some character.
+
+61
+00:07:10,400 --> 00:07:16,320
+And see if that works. I'm going to put that here. Delete that.
+
+62
+00:07:19,120 --> 00:07:20,960
+And see what happens. Save.
+
+63
+00:07:20,960 --> 00:07:25,680
+Run the sheet again.
+
+64
+00:07:37,679 --> 00:07:42,479
+And that didn't do what I wanted to do. Maybe it's just not on.
+
+65
+00:07:44,479 --> 00:07:45,840
+Let's move it over more.
+
+66
+00:07:45,840 --> 00:07:51,200
+Let's just delete that for the time being. Say save.
+
+67
+00:07:53,760 --> 00:07:54,960
+And rerun the drawing.
+
+68
+00:07:59,440 --> 00:08:06,960
+Oh there we go. Yep. You can replace that view title SVG with another one here.
+
+69
+00:08:07,599 --> 00:08:09,919
+Copy over the one from our template.
+
+70
+00:08:13,919 --> 00:08:14,799
+Just replace it.
+
+71
+00:08:15,840 --> 00:08:20,880
+And hopefully when we rerun the drawing.
+
+72
+00:08:24,000 --> 00:08:24,880
+Oh there we go.
+
diff --git a/126000_20250523_1122 - Starting the site modeling/126000_20250523_1122 - Starting the site modeling.srt b/126000_20250523_1122 - Starting the site modeling/126000_20250523_1122 - Starting the site modeling.srt
new file mode 100644
index 0000000..e75cf1b
--- /dev/null
+++ b/126000_20250523_1122 - Starting the site modeling/126000_20250523_1122 - Starting the site modeling.srt
@@ -0,0 +1,580 @@
+1
+00:00:00,000 --> 00:00:08,040
+So let's start creating our site plan. So the first step towards that is
+
+2
+00:00:08,040 --> 00:00:18,420
+downloading an aerial from our local GIS site. You can see here it's got the top
+
+3
+00:00:18,420 --> 00:00:25,320
+of lines and then the lower left is a scale that we're going to use. So let's
+
+4
+00:00:25,360 --> 00:00:33,840
+bring in that texture and apply it to this plane that I made off-camera. This
+
+5
+00:00:33,840 --> 00:00:40,640
+is a simple plane, four edges on it, and I assigned it to an IFC virtual element
+
+6
+00:00:40,640 --> 00:00:47,200
+here and then I gave it an object type reference image. It can be basically
+
+7
+00:00:47,200 --> 00:00:53,320
+anything but it's just I picked a name where again you can quickly select these
+
+8
+00:00:53,360 --> 00:01:02,720
+types of objects in the file. So let's apply the texture to this object a
+
+9
+00:01:02,720 --> 00:01:09,080
+different way instead of using external materials that we have done for all the
+
+10
+00:01:09,080 --> 00:01:14,200
+materials in the project so far. Let's create a material that's specific to I
+
+11
+00:01:14,200 --> 00:01:20,120
+FC that's actually saved in the IFC file. So the whole definitions in the IFC file
+
+12
+00:01:20,360 --> 00:01:31,080
+only the textures outside. So to start we're gonna go to styles and you would
+
+13
+00:01:31,080 --> 00:01:38,080
+think well let me just try to start a new one and you would think we can right
+
+14
+00:01:38,080 --> 00:01:43,120
+out of the gate do a surface style with textures. And I'm just gonna call
+
+15
+00:01:43,120 --> 00:01:53,160
+this aerial. I'm gonna call this aerial. There we go. And let's try to save new
+
+16
+00:01:53,160 --> 00:01:58,480
+styles. So it'll gives you this warning adding a surface style with textures
+
+17
+00:01:58,480 --> 00:02:02,520
+directly is not supported. You need to create a rendering style and then add a
+
+18
+00:02:02,520 --> 00:02:07,480
+texture style to it. So let's do exactly what it says. We're gonna start a
+
+19
+00:02:07,520 --> 00:02:15,160
+rendering style first and the color doesn't matter and we say save. So here's
+
+20
+00:02:15,160 --> 00:02:23,480
+the start of it. So now we can go into textures. So click on that. So we need to
+
+21
+00:02:23,480 --> 00:02:30,960
+it has zero textures right now and we want to add one. And the UV mode that we
+
+22
+00:02:30,960 --> 00:02:40,920
+want is we want generated. And this is where you locate your the texture. So
+
+23
+00:02:40,920 --> 00:02:46,800
+we'll navigate to where's that oops
+
+24
+00:02:46,800 --> 00:03:02,360
+it's this one here and say okay and say okay. Now also one thing too I forgot to
+
+25
+00:03:02,360 --> 00:03:07,280
+mention is that if you select that and go over here you can see the dimensions
+
+26
+00:03:07,280 --> 00:03:14,920
+of that aspect ratio of that texture. It's 1920 by 931. So I made this plane
+
+27
+00:03:14,920 --> 00:03:25,279
+with that same aspect ratio. If you tab into it you can see I did 931 by 1920
+
+28
+00:03:25,279 --> 00:03:30,640
+there. Obviously that's not the exact size but it's just a way just to get the
+
+29
+00:03:30,640 --> 00:03:35,279
+aspect ratio of the rectangle correct. I could have used inches or meters or
+
+30
+00:03:35,279 --> 00:03:43,320
+whatever. So I'll tab out of it. So we want to now apply that style that we
+
+31
+00:03:43,320 --> 00:03:57,079
+just made to that rectangle. So I'll do that here. It's a search area. Okay and
+
+32
+00:03:57,079 --> 00:04:01,160
+hopefully if we go to material preview
+
+33
+00:04:01,920 --> 00:04:10,040
+it should show up. Oh we need to see okay this is good. So the aspect ratio was
+
+34
+00:04:10,040 --> 00:04:17,959
+wrong. So there's a quick way or the orientation was wrong. We tab into it and
+
+35
+00:04:17,959 --> 00:04:28,599
+put our 3d cursor at the corner. We can actually rotate it 90. I'm just
+
+36
+00:04:28,599 --> 00:04:32,440
+going to rotate it back 180 just.
+
+37
+00:04:32,440 --> 00:04:45,560
+And then tab out of it. And so there yeah it looks better. Okay all right so
+
+38
+00:04:45,560 --> 00:04:52,640
+obviously this is still the wrong scale. So we are going to go down here to the
+
+39
+00:04:52,640 --> 00:04:59,600
+little scale there and activate our measure tool. And we're going to start
+
+40
+00:04:59,600 --> 00:05:07,560
+here. Hit the X to lock it.
+
+41
+00:05:08,600 --> 00:05:20,000
+And we're going to end here. Return. So we're going to take that dimension there
+
+42
+00:05:20,120 --> 00:05:26,800
+80 and divide it by the 40 to see what kind of scale we have to deal with. So
+
+43
+00:05:26,880 --> 00:05:37,200
+off-camera I did that calculation quickly. And it is we tab into it. Select
+
+44
+00:05:37,200 --> 00:05:42,360
+everything we're going to scale. Point
+
+45
+00:05:42,920 --> 00:05:54,760
+four nine seven six five. And tab out of it again. So hopefully if we do our
+
+46
+00:05:54,920 --> 00:05:59,719
+measurement again just to verify.
+
+47
+00:06:00,440 --> 00:06:10,360
+Pretty cool. So yes there we go 40. So now that we have the scale correctly
+
+48
+00:06:10,360 --> 00:06:17,039
+let's create a bunch of polylines that follow these topo lines. So I'm just
+
+49
+00:06:17,040 --> 00:06:26,960
+gonna create a simple plane here. And tab into it.
+
+50
+00:06:31,840 --> 00:06:41,280
+And we're just going to delete these two vertices. Move this kind of close here.
+
+51
+00:06:42,280 --> 00:06:54,919
+And I'll just select the vertices here and type E for extend. And just follow the lines
+
+52
+00:06:54,919 --> 00:07:02,719
+here. And ultimately off-camera I'm gonna do that for all these. Obviously it'll
+
+53
+00:07:02,719 --> 00:07:10,520
+take some time. But this is kind of what I'm generally gonna do. So I've gone
+
+54
+00:07:10,560 --> 00:07:17,680
+through and outlined all the topo lines there. And turn off the aerial so you can
+
+55
+00:07:17,680 --> 00:07:25,760
+see a little better. You'll notice that these if I put on the measure tool and
+
+56
+00:07:25,760 --> 00:07:32,400
+select that hold Z and snap to the other topo. They're two feet in elevation
+
+57
+00:07:32,400 --> 00:07:38,520
+difference to each other. So let's create then now that we have these lines let's
+
+58
+00:07:38,520 --> 00:07:47,400
+create a face then for the entire topo. So to do that select one of those
+
+59
+00:07:47,400 --> 00:07:53,960
+ctrl L for the whole line there. And I'm gonna duplicate that. I'll show you why a
+
+60
+00:07:53,960 --> 00:08:00,080
+little bit later. And then select this other one and we're going to ctrl L that.
+
+61
+00:08:00,080 --> 00:08:07,200
+And once we have two lines there we're gonna type F for face to create a face.
+
+62
+00:08:07,200 --> 00:08:14,920
+Now we want to go to face here and we do triangulate faces. So there's triangles
+
+63
+00:08:14,920 --> 00:08:23,840
+now. So now once that's done I'm going to hide this. So that's we did that face
+
+64
+00:08:23,840 --> 00:08:29,760
+already so it doesn't confuse us going forward. So again I'm gonna select this
+
+65
+00:08:29,800 --> 00:08:43,159
+and I duplicate it. That's like this ctrl L face and then triangulate. So I'm
+
+66
+00:08:43,159 --> 00:08:51,080
+gonna do this then for all these other topo lines. So I've been converting these
+
+67
+00:08:51,080 --> 00:08:57,280
+topo lines to faces but I got to a scenario where our procedure doesn't
+
+68
+00:08:57,280 --> 00:09:04,000
+apply or doesn't work as nice. So these two topo lines here are at the same
+
+69
+00:09:04,000 --> 00:09:10,480
+level and this one's different two foot different. So if I select you know all of
+
+70
+00:09:10,480 --> 00:09:18,360
+them and do F the face is all distorted. So we have to go little by little on
+
+71
+00:09:18,360 --> 00:09:23,920
+this one. So let's just select these and do a face.
+
+72
+00:09:23,920 --> 00:09:32,479
+Now that still doesn't work here. See if we can get less than. Do a face there we go.
+
+73
+00:09:32,479 --> 00:09:43,439
+Select these. Do a face. So just do the line select.
+
+74
+00:09:43,440 --> 00:09:57,640
+Do a face and then the rest of these then. Do a face. No that one's still wonky so I'm just
+
+75
+00:09:57,640 --> 00:10:12,160
+gonna actually delete those. Select these again.
+
+76
+00:10:13,440 --> 00:10:23,240
+And do a face. It's a little cleaner typology. So again then once all those
+
+77
+00:10:23,240 --> 00:10:36,920
+are selected. Select them and do triangulation. So now I can do an alt H
+
+78
+00:10:36,920 --> 00:10:43,120
+then. Do unselect all the other ones that I just did and I want to do an H to
+
+79
+00:10:43,120 --> 00:10:49,640
+select everything. And because we duplicated every topo line as we're
+
+80
+00:10:49,640 --> 00:10:56,600
+making them there's some redundancies there. So if I move kind of there's
+
+81
+00:10:56,600 --> 00:11:03,720
+points on points basically. And so we want to merge all those points so the
+
+82
+00:11:03,720 --> 00:11:13,440
+topo is one clean mesh. So select everything and we are going to go to
+
+83
+00:11:13,440 --> 00:11:22,520
+mesh cleanup and let's see here merge by distance. So it'll take duplicate
+
+84
+00:11:22,520 --> 00:11:26,920
+vertices and merge them together then.
+
+85
+00:11:27,199 --> 00:11:37,199
+There we go. So if we tab out of this then and alt H to turn on the aerial we
+
+86
+00:11:37,199 --> 00:11:46,520
+can then fill in the rest of this topo so it's a nice rectangle or follows the
+
+87
+00:11:46,520 --> 00:11:57,040
+aerial then. And start this by click those two do an F and then kind of
+
+88
+00:11:57,040 --> 00:12:00,560
+select these lines.
+
+89
+00:12:00,560 --> 00:12:16,000
+Do an F and then triangulate again. So I'm gonna do that then for the rest of
+
+90
+00:12:16,000 --> 00:12:26,479
+the aerial there. So one thing I ran into while trying to close this out is I
+
+91
+00:12:26,480 --> 00:12:32,200
+created a line here and a line here and a line here and you can see the segments
+
+92
+00:12:32,200 --> 00:12:41,960
+that I have selected here. If I do an F the face you can see that it is all
+
+93
+00:12:41,960 --> 00:12:51,640
+wonky there. So to rectify you want to take these lines and give them more
+
+94
+00:12:51,640 --> 00:12:59,560
+subdivision. So I'll just increase the count to something that looks similar to
+
+95
+00:12:59,560 --> 00:13:05,720
+the resolution of this edge and then go through.
+
+96
+00:13:05,720 --> 00:13:13,480
+Let's see here. Select these.
+
+97
+00:13:15,240 --> 00:13:24,280
+Select some of these. I won't do all of them but just get a sense.
+
+98
+00:13:25,000 --> 00:13:32,080
+And then type F so that works a little better. Okay now that we've closed all
+
+99
+00:13:32,080 --> 00:13:42,560
+the faces we can tab out of it and convert it to an IFC geography element
+
+100
+00:13:42,560 --> 00:13:54,240
+with the predefined type terrain. Let's see. Okay so I open this file a new and
+
+101
+00:13:54,240 --> 00:13:59,800
+you can see I turned on the material preview there but our aerial image is
+
+102
+00:13:59,800 --> 00:14:07,560
+not showing up. It's because it's an IFC virtual element and if you remember we
+
+103
+00:14:07,560 --> 00:14:13,400
+have a preference in Bonsai here.
+
+104
+00:14:17,520 --> 00:14:24,479
+Where these classes here, the list of classes, turn to wireframe when you open
+
+105
+00:14:24,480 --> 00:14:30,720
+it up. So I see virtual element is wireframe there. So to rectify that
+
+106
+00:14:30,720 --> 00:14:37,920
+temporarily during your working session. So you can go here to viewport and
+
+107
+00:14:37,920 --> 00:14:46,080
+change that to texture. And if we want to see the actual triangulation in that
+
+108
+00:14:46,080 --> 00:14:55,400
+topo that we just made you can increase this value there. So this is the
+
+109
+00:14:55,400 --> 00:15:02,200
+existing topo and like any project this will probably change as we put our
+
+110
+00:15:02,200 --> 00:15:07,480
+building on the site. So we're gonna ultimately change that and I can show
+
+111
+00:15:07,480 --> 00:15:12,640
+you a tool too that helps with that. So I'm just actually gonna duplicate this
+
+112
+00:15:12,640 --> 00:15:23,840
+over and select the topo object and go to sculpting here. This is specific to
+
+113
+00:15:23,840 --> 00:15:33,880
+object and go to sculpting here. This is specific to vanilla blender.
+
+114
+00:15:33,880 --> 00:15:39,240
+And so with that selected it doesn't show that it's selected in this view but
+
+115
+00:15:39,240 --> 00:15:46,120
+you can see that there's a tons of tools over here to modify a topo or a
+
+116
+00:15:46,120 --> 00:15:53,920
+mesh. So we'll just use the first one and if you hover and press you can see that
+
+117
+00:15:53,920 --> 00:16:00,000
+it deforms the mesh like that. And there's various tools you can you know
+
+118
+00:16:00,000 --> 00:16:04,720
+that one aided away this one will build it up I believe you can see there. You
+
+119
+00:16:04,720 --> 00:16:16,680
+can increase the strength and also the size of a big the radius is that affects
+
+120
+00:16:16,680 --> 00:16:29,000
+the area. So once you do that you go back to our BIM workspace there and right now
+
+121
+00:16:29,000 --> 00:16:35,600
+our changes are not saved in the IFC file so you have to go over here and
+
+122
+00:16:35,600 --> 00:16:41,080
+we've done this a number of times you have to manually save representation and
+
+123
+00:16:41,080 --> 00:16:48,280
+then when you open up the IFC file again those changes will be saved. So as you
+
+124
+00:16:48,280 --> 00:16:57,240
+probably noticed when we were deforming this it deforms the the vertices that
+
+125
+00:16:57,240 --> 00:17:03,920
+make up the triangle and so if you have a large triangle here your ability to
+
+126
+00:17:03,920 --> 00:17:14,280
+deform it is limited. So if you want more subtle control of the deformation of a
+
+127
+00:17:14,280 --> 00:17:22,880
+topo you would increase the deformation of a topo you would increase the
+
+128
+00:17:22,880 --> 00:17:32,120
+triangulation. So to do that you select the object and we could tab into it but
+
+129
+00:17:32,120 --> 00:17:38,360
+as you see when we tab into it it does this kind of limited dissolve where it
+
+130
+00:17:38,360 --> 00:17:46,880
+makes the areas flatter so it's a little deceiving. So instead of tabbing into it
+
+131
+00:17:46,880 --> 00:17:52,400
+let's go to this edit mode instead we can still see the triangulation.
+
+132
+00:17:53,400 --> 00:18:01,000
+So let's say you know this these size triangles work for us but these larger
+
+133
+00:18:01,000 --> 00:18:08,080
+triangles we want to break down so we can select any particular triangle and
+
+134
+00:18:08,080 --> 00:18:15,240
+go to select and select similar go area and then down here we're gonna say
+
+135
+00:18:15,240 --> 00:18:23,360
+greater than so we're gonna keep the threshold the same I'm actually not
+
+136
+00:18:23,360 --> 00:18:27,800
+quite sure what threshold means I haven't figured that out but anyway so
+
+137
+00:18:27,800 --> 00:18:32,000
+we'll select the triangles that we kind of want to break down further and then
+
+138
+00:18:32,000 --> 00:18:40,240
+you just go to your subdivision right click and subdivide and then you can
+
+139
+00:18:40,240 --> 00:18:44,760
+mess with this to subdivide it to a level that you know you're comfortable
+
+140
+00:18:44,760 --> 00:18:51,920
+with for what you want to do and once you get there then you select everything
+
+141
+00:18:51,920 --> 00:18:57,240
+and then go to triangulate faces again just to make sure
+
+142
+00:18:57,240 --> 00:19:07,840
+everything's triangulated. So if you then go back to the sculpting tool you can
+
+143
+00:19:07,840 --> 00:19:14,360
+see that there's a greater degree of subtlety we can change things down here
+
+144
+00:19:15,760 --> 00:19:23,960
+so that might not be subtle enough you might have to go back and create more
+
+145
+00:19:23,960 --> 00:19:25,800
+triangulation or smaller triangles.
+
diff --git a/127000_20250523_1509 - More site modification/127000_20250523_1509 - More site modification.srt b/127000_20250523_1509 - More site modification/127000_20250523_1509 - More site modification.srt
new file mode 100644
index 0000000..2d408a1
--- /dev/null
+++ b/127000_20250523_1509 - More site modification/127000_20250523_1509 - More site modification.srt
@@ -0,0 +1,176 @@
+1
+00:00:00,000 --> 00:00:06,320
+So let's continue refining our site topography here. Since the last video you can see I moved
+
+2
+00:00:06,320 --> 00:00:13,840
+the site closer to the house. I've also modeled in the property lines here. If I select that
+
+3
+00:00:16,080 --> 00:00:19,920
+those are all the property lines. I'll hide them. Then I modeled in
+
+4
+00:00:19,920 --> 00:00:22,800
+setbacks as well. Select those and hide them.
+
+5
+00:00:22,800 --> 00:00:40,320
+We can if we want. Oh the other thing too is that I made these edges cleaner to align exactly with
+
+6
+00:00:40,320 --> 00:00:46,160
+our aerial image here. So those are exactly the same size you know viewed from the top.
+
+7
+00:00:47,120 --> 00:00:55,120
+So if we want to apply this texture to this object we can. We just select it. Go to materials
+
+8
+00:00:56,000 --> 00:01:02,080
+and then surfaces. We can select that aerial style and apply it.
+
+9
+00:01:03,679 --> 00:01:08,880
+So we can actually hide this one for the time being. So there it is applied to the topography.
+
+10
+00:01:08,880 --> 00:01:19,440
+So I've modeled in this. It's not an IFC object. It's just a vanilla object. It's a rectangle that
+
+11
+00:01:19,440 --> 00:01:29,280
+follows the property lines exactly. So we're going to use a blender tool to project this outline down
+
+12
+00:01:29,280 --> 00:01:39,280
+onto the topography and actually cut a line in the mesh. So to do that you select the mesh.
+
+13
+00:01:40,880 --> 00:01:44,400
+Actually before I do that. So this is the one in the outline of the plane.
+
+14
+00:01:45,040 --> 00:01:51,120
+So I'm going to select the mesh and go to edit mode. We're going to go to top view.
+
+15
+00:01:52,320 --> 00:01:58,960
+We can control click on that plane that I was just talking about. We're going to go up here
+
+16
+00:02:00,000 --> 00:02:09,840
+to knife project. Let's see what happens here. You see it projects that rectangle down into the mesh
+
+17
+00:02:09,840 --> 00:02:21,840
+there. So I'm going to save this selection. I'm just going to call it temp because it does not
+
+18
+00:02:21,840 --> 00:02:27,280
+survive. It's not saved in the IFC file. It's only in this blender session.
+
+19
+00:02:28,000 --> 00:02:36,800
+So I'm going to assign all that mesh to that. I'm going to select everything
+
+20
+00:02:38,240 --> 00:02:47,120
+and I'm going to triangulate faces again. You can see there. So after that I'm going to use this
+
+21
+00:02:47,760 --> 00:02:54,480
+vertex group again and we're going to select those that we had before. Now like the previous
+
+22
+00:02:54,480 --> 00:03:01,920
+video I'm going to break these triangles down more so to give us more granularity.
+
+23
+00:03:02,720 --> 00:03:13,040
+So right click and subdivide and I start subdividing more and more and more to a point
+
+24
+00:03:13,440 --> 00:03:19,040
+to a point where I think there's enough detail there where I can start modifying.
+
+25
+00:03:21,920 --> 00:03:23,359
+I think that feels about right.
+
+26
+00:03:25,519 --> 00:03:33,120
+Maybe one more. Yeah, any more. It starts getting too big and laggy. See it's already kind of laggy
+
+27
+00:03:33,760 --> 00:03:35,440
+but I think that's pretty good.
+
+28
+00:03:35,440 --> 00:03:41,280
+So I'm going to exit out of that then out of tab.
+
+29
+00:03:50,720 --> 00:03:52,079
+And again remember to
+
+30
+00:03:56,880 --> 00:03:58,480
+save the representation here.
+
+31
+00:04:05,600 --> 00:04:12,400
+And then we can ultimately delete this plane then once we're done.
+
+32
+00:04:15,120 --> 00:04:20,079
+Another cleanup measure we can do is to get rid of some of these triangles that are too tiny.
+
+33
+00:04:20,880 --> 00:04:32,960
+You go into edit mode. Select the face. Any one of those. Go to select similar area.
+
+34
+00:04:32,960 --> 00:04:43,599
+And do area less than. And mesh cleanup limited dissolve.
+
+35
+00:04:46,400 --> 00:04:46,799
+And then
+
+36
+00:04:49,280 --> 00:04:50,080
+triangulate.
+
+37
+00:04:52,960 --> 00:04:54,320
+Which makes them a little bigger.
+
+38
+00:04:56,960 --> 00:04:58,400
+We do that here as well.
+
+39
+00:04:58,400 --> 00:05:02,080
+Select area.
+
+40
+00:05:04,479 --> 00:05:04,960
+Smaller.
+
+41
+00:05:07,039 --> 00:05:07,520
+Clean up.
+
+42
+00:05:09,200 --> 00:05:13,200
+Dissolve and then face triangulation.
+
+43
+00:05:22,080 --> 00:05:23,760
+Exit out again.
+
+44
+00:05:28,400 --> 00:05:32,080
+And then ultimately again manually save.
+
diff --git a/128000_20250529_1545 - Model updates in prep for site layout/128000_20250529_1545 - Model updates in prep for site layout.srt b/128000_20250529_1545 - Model updates in prep for site layout/128000_20250529_1545 - Model updates in prep for site layout.srt
new file mode 100644
index 0000000..46de538
--- /dev/null
+++ b/128000_20250529_1545 - Model updates in prep for site layout/128000_20250529_1545 - Model updates in prep for site layout.srt
@@ -0,0 +1,220 @@
+1
+00:00:00,000 --> 00:00:04,000
+So as you can see, I've done a number of changes since the last video.
+
+2
+00:00:04,000 --> 00:00:10,000
+And to see those changes again, we can use our get version tracking.
+
+3
+00:00:10,000 --> 00:00:13,000
+And refresh the commit history here.
+
+4
+00:00:13,000 --> 00:00:20,000
+If we click on these various commits, you'll notice that the icons that we used before do not show up.
+
+5
+00:00:20,000 --> 00:00:25,000
+It's because we don't have, or we did not commit the changes yet.
+
+6
+00:00:25,000 --> 00:00:29,000
+But you still can see the changes if you show uncommitted changes.
+
+7
+00:00:29,000 --> 00:00:31,000
+Click on that.
+
+8
+00:00:31,000 --> 00:00:33,000
+And again it colorizes everything.
+
+9
+00:00:33,000 --> 00:00:38,000
+Those things that are green are new since the last change.
+
+10
+00:00:38,000 --> 00:00:47,000
+So if I select something green and I do a shift G, I can select by color.
+
+11
+00:00:47,000 --> 00:00:50,000
+So I isolate that.
+
+12
+00:00:51,000 --> 00:00:53,000
+Turn on the material preview.
+
+13
+00:00:55,000 --> 00:01:02,000
+So you see I added some driveways and sidewalks and various trees.
+
+14
+00:01:02,000 --> 00:01:05,000
+Modeled in existing structures.
+
+15
+00:01:05,000 --> 00:01:09,000
+I also added a new roof.
+
+16
+00:01:09,000 --> 00:01:12,000
+A roof that's going in a different direction.
+
+17
+00:01:12,000 --> 00:01:19,000
+This is anticipation for creating three different housing types.
+
+18
+00:01:19,000 --> 00:01:21,000
+Housing type A, B, C.
+
+19
+00:01:21,000 --> 00:01:29,000
+The difference between those various housing types will be siding material.
+
+20
+00:01:29,000 --> 00:01:35,000
+And also roof direction for just this one item here.
+
+21
+00:01:36,000 --> 00:01:48,000
+The other thing I've changed is that the exterior wall type definition, I removed the cladding layer in there.
+
+22
+00:01:48,000 --> 00:01:54,000
+And I actually modeled in another object for the cladding itself.
+
+23
+00:01:54,000 --> 00:01:57,000
+So if you select that, you'll see it's an IFC covering.
+
+24
+00:01:57,000 --> 00:02:02,000
+And it has one layer, a half inch layer.
+
+25
+00:02:03,000 --> 00:02:11,000
+And so what that allows me to do is have that exterior wall be common to all these three different housing types.
+
+26
+00:02:11,000 --> 00:02:17,000
+And then I can just change the cladding type on the exterior.
+
+27
+00:02:19,000 --> 00:02:24,000
+So if you go to the outliner, you can kind of see how I started organizing some things.
+
+28
+00:02:24,000 --> 00:02:27,000
+I'm going to turn everything on here again.
+
+29
+00:02:28,000 --> 00:02:37,000
+So if I select type AC, these objects, and I'll isolate it.
+
+30
+00:02:37,000 --> 00:02:43,000
+These objects are common to type A and type C housing type.
+
+31
+00:02:43,000 --> 00:02:47,000
+I can do that with AB again.
+
+32
+00:02:47,000 --> 00:02:56,000
+So these objects are common to type A and type B housing type.
+
+33
+00:02:57,000 --> 00:03:00,000
+And then keep going with the concept.
+
+34
+00:03:00,000 --> 00:03:03,000
+These are specific to type C.
+
+35
+00:03:04,000 --> 00:03:07,000
+These are specific to type B.
+
+36
+00:03:09,000 --> 00:03:18,000
+And then I also have that portal, that entry portal in different locations.
+
+37
+00:03:19,000 --> 00:03:32,000
+So as we locate this housing type on the site, we're going to rotate it, mirror it, and sometimes these entry portals are different locations.
+
+38
+00:03:32,000 --> 00:03:37,000
+So for one housing type, it'll be located there.
+
+39
+00:03:37,000 --> 00:03:40,000
+For another one, it'll be located here.
+
+40
+00:03:42,000 --> 00:03:45,000
+Another one, it'll be located back here.
+
+41
+00:03:46,000 --> 00:03:59,000
+So putting it in its own kind of IFC building, and you'll see here coming up, makes it easy to move those objects around or turn them on and off too.
+
+42
+00:04:01,000 --> 00:04:02,000
+What else?
+
+43
+00:04:03,000 --> 00:04:18,000
+So I also created drawings, or a working drawing essentially for the various types, type A, B, and C.
+
+44
+00:04:18,000 --> 00:04:21,000
+So I'm just going to open type A.
+
+45
+00:04:21,000 --> 00:04:33,000
+And so you'll see I used the exclude filter.
+
+46
+00:04:33,000 --> 00:04:38,000
+I'm going to open it up and show you what it all entails here.
+
+47
+00:04:39,000 --> 00:04:56,000
+So the exclude filter for type A unit, I've turned on stuff that's in type B, garage type B, garage type C, turned off the entry at the front, the entry at the courtyard, and the entry at the back.
+
+48
+00:04:56,000 --> 00:05:04,000
+And so with all that turned off then, type A housing type looks like this.
+
+49
+00:05:05,000 --> 00:05:20,000
+So if I go then to type B, and if I hit hold alt and click on this, it'll keep the view in the same place, but it'll change the exclude filters.
+
+50
+00:05:21,000 --> 00:05:36,000
+And so here, similar concept of I've opened up the exclude filters, you'll see kind of the same structure, but I turned off one entry portal and turned on another.
+
+51
+00:05:41,000 --> 00:05:46,000
+And then type C, I hit alt, that icon.
+
+52
+00:05:50,000 --> 00:05:53,000
+I'll show you housing type C then.
+
+53
+00:05:55,000 --> 00:06:03,000
+So the objective then going forward is to lay out this site with these various housing types.
+
+54
+00:06:03,000 --> 00:06:08,000
+I think we're going to be able to get six houses total on the site.
+
+55
+00:06:08,000 --> 00:06:29,000
+So in the next video then I will show you how to place these housing types on the site and how to use Blender, we're actually going to use Blender, to mirror and rotate these various housing types.
+
diff --git a/129000_20250529_1627 - Laying out the site with housing types/129000_20250529_1627 - Laying out the site with housing types.srt b/129000_20250529_1627 - Laying out the site with housing types/129000_20250529_1627 - Laying out the site with housing types.srt
new file mode 100644
index 0000000..267a50b
--- /dev/null
+++ b/129000_20250529_1627 - Laying out the site with housing types/129000_20250529_1627 - Laying out the site with housing types.srt
@@ -0,0 +1,488 @@
+1
+00:00:00,000 --> 00:00:05,800
+Okay, let's start laying out the various housing types onto the site.
+
+2
+00:00:05,800 --> 00:00:12,220
+So to do this, we're going to break one of our cardinal rules that we mentioned very
+
+3
+00:00:12,220 --> 00:00:17,880
+early on, and we're going to save both the IFC file and the BUN file together at the
+
+4
+00:00:17,880 --> 00:00:20,680
+same time.
+
+5
+00:00:20,680 --> 00:00:28,420
+That if you're not familiar or if you're relatively new to Bonsai can be dangerous because the
+
+6
+00:00:28,620 --> 00:00:34,200
+syncing gets broken sometimes, and so you'll be working away thinking everything's saving
+
+7
+00:00:34,200 --> 00:00:40,220
+in the IC file and it's not really, it's just saving in the BUN file.
+
+8
+00:00:40,220 --> 00:00:44,220
+But it is possible if you're careful.
+
+9
+00:00:44,220 --> 00:00:49,500
+And so going forward, we're going to pretend we're experts and we're going to save both
+
+10
+00:00:49,500 --> 00:00:53,180
+the IFC file and the BUN file together.
+
+11
+00:00:53,180 --> 00:01:04,660
+What that allows us to do is to bring in, kind of linked as an xref type of concept,
+
+12
+00:01:04,660 --> 00:01:18,220
+to bring in the Blender version of this file into this file and basically lay out the site
+
+13
+00:01:18,220 --> 00:01:22,600
+with the various housing types.
+
+14
+00:01:22,600 --> 00:01:29,800
+So to start, I'm going to go down here and say save.
+
+15
+00:01:29,800 --> 00:01:35,800
+We're going to navigate to where the model is, this is where the model is, and we're
+
+16
+00:01:35,800 --> 00:01:37,520
+going to say just house.
+
+17
+00:01:37,520 --> 00:01:41,840
+It'll be a blend file.
+
+18
+00:01:41,840 --> 00:01:43,919
+So we can save it.
+
+19
+00:01:43,920 --> 00:01:54,920
+So now when we go up and do the save IC project, it saves both the blend file and the IFC file
+
+20
+00:01:54,920 --> 00:01:55,920
+together.
+
+21
+00:01:55,920 --> 00:02:04,120
+So if we go over to our repo folder here, you can see that here are the two files and
+
+22
+00:02:04,120 --> 00:02:07,880
+currently they're connected.
+
+23
+00:02:07,880 --> 00:02:16,440
+So we are going to copy this and we're going to paste it.
+
+24
+00:02:16,440 --> 00:02:19,100
+So we're creating a copy of that blend file.
+
+25
+00:02:19,100 --> 00:02:25,160
+So conceptually now, we're going to be in this house file, we're going to actually link
+
+26
+00:02:25,160 --> 00:02:30,600
+in the collections and various housing types from this house copy.
+
+27
+00:02:30,600 --> 00:02:44,280
+So if we go back here and go to link, navigate to this house copy here, and we're going into
+
+28
+00:02:44,280 --> 00:02:46,000
+collections now.
+
+29
+00:02:46,000 --> 00:02:53,560
+So in the previous video, I showed you that I organized the file with these various spatial
+
+30
+00:02:53,560 --> 00:02:56,660
+containers.
+
+31
+00:02:56,660 --> 00:03:05,700
+This is anticipation of, okay, now we're going to bring these packets, basically, of spatial
+
+32
+00:03:05,700 --> 00:03:08,340
+information into this file.
+
+33
+00:03:08,340 --> 00:03:14,780
+So I'm just going to start with this entry at the back.
+
+34
+00:03:14,780 --> 00:03:17,700
+And so there you can see it's been added there.
+
+35
+00:03:17,700 --> 00:03:21,100
+So I'm going to just keep doing that.
+
+36
+00:03:21,100 --> 00:03:34,620
+Go to link and just keep moving down with all these containers then.
+
+37
+00:03:34,620 --> 00:03:39,340
+So then I'll just get back to you then after I've added all those containers.
+
+38
+00:03:39,340 --> 00:03:45,340
+Okay, I linked in all those spatial components there.
+
+39
+00:03:45,340 --> 00:03:52,300
+You can see I'll do a control I invert the selection and hide everything else.
+
+40
+00:03:52,300 --> 00:03:56,260
+So we can just see what we're pulled in.
+
+41
+00:03:56,260 --> 00:04:06,180
+So now let's select those components that make up housing type C. So we'll click on
+
+42
+00:04:06,180 --> 00:04:10,180
+side, we'll skip the garages.
+
+43
+00:04:10,180 --> 00:04:19,380
+We'll do a type AC, type C, and the first and second and base basement.
+
+44
+00:04:19,380 --> 00:04:25,760
+And then we will duplicate that in place.
+
+45
+00:04:25,760 --> 00:04:31,100
+And then I'm going to move it over 100 feet.
+
+46
+00:04:31,100 --> 00:04:39,900
+And I'm going to right click to create or move to collection.
+
+47
+00:04:39,900 --> 00:04:55,260
+And I'm going to create a new collection called house type C. There it is.
+
+48
+00:04:55,260 --> 00:05:04,640
+So we want to be able to select one of these things and move it and have everything kind
+
+49
+00:05:04,640 --> 00:05:07,599
+of attached to each other.
+
+50
+00:05:07,599 --> 00:05:13,400
+So we're going to use a concept called parenting in Blender.
+
+51
+00:05:13,400 --> 00:05:24,240
+So if we select all those components and the last, we want to pick the first floor as the
+
+52
+00:05:24,240 --> 00:05:25,240
+active object.
+
+53
+00:05:25,240 --> 00:05:28,720
+And so we'll just do control select.
+
+54
+00:05:28,720 --> 00:05:30,520
+So that's the active object.
+
+55
+00:05:30,520 --> 00:05:38,840
+We go up to object and down to parent and click on object.
+
+56
+00:05:38,840 --> 00:05:49,340
+So now if we select the first floor here and move it, everything moves with it.
+
+57
+00:05:49,340 --> 00:05:51,620
+So I'm going to then do that same concept.
+
+58
+00:05:51,620 --> 00:05:53,380
+We can do one more.
+
+59
+00:05:53,380 --> 00:05:59,380
+We can do type B. So it's here.
+
+60
+00:05:59,380 --> 00:06:06,620
+Basement, second, first, B, type AB.
+
+61
+00:06:06,620 --> 00:06:07,780
+And what else do we want?
+
+62
+00:06:07,780 --> 00:06:15,700
+We want the front entry.
+
+63
+00:06:15,700 --> 00:06:18,580
+And duplicate it.
+
+64
+00:06:18,580 --> 00:06:22,859
+And I'm going to go 200 this time.
+
+65
+00:06:22,859 --> 00:06:36,620
+And right click, move to collection, new collection, house, type B. Great.
+
+66
+00:06:36,620 --> 00:06:38,820
+Select those.
+
+67
+00:06:38,820 --> 00:06:42,020
+Control the first floor to make that active.
+
+68
+00:06:42,020 --> 00:06:47,620
+Go up to object, parent, object.
+
+69
+00:06:47,660 --> 00:06:50,820
+So now that should all move together.
+
+70
+00:06:50,820 --> 00:06:56,620
+So I'm going to do that same concept for housing type A and then also the garages as well.
+
+71
+00:06:56,620 --> 00:06:58,740
+And I'll get back to you.
+
+72
+00:06:58,740 --> 00:06:59,740
+So I copied everything over.
+
+73
+00:06:59,740 --> 00:07:12,500
+You can see here I got a housing type C, house type B, house type A, garage A, garage B,
+
+74
+00:07:12,500 --> 00:07:15,700
+and garage C.
+
+75
+00:07:15,780 --> 00:07:21,620
+So I'm going to select all these, right click, select all the objects, and I'm going to move
+
+76
+00:07:21,620 --> 00:07:26,300
+them like 300 feet over just so they're further off the site.
+
+77
+00:07:26,300 --> 00:07:32,219
+I'm going to turn on the site then.
+
+78
+00:07:32,219 --> 00:07:36,900
+And I'm going to duplicate this collection here.
+
+79
+00:07:36,900 --> 00:07:41,659
+So we got housing type C here.
+
+80
+00:07:41,659 --> 00:07:44,780
+Turn off snap.
+
+81
+00:07:44,780 --> 00:07:50,020
+So now we want to move that into place.
+
+82
+00:07:50,020 --> 00:07:53,979
+So it's going to go somewhere there.
+
+83
+00:07:53,979 --> 00:07:59,859
+And I'm going to start rotating it then to 90.
+
+84
+00:07:59,859 --> 00:08:05,859
+Actually, let's see here.
+
+85
+00:08:05,940 --> 00:08:12,940
+I'm going to do another 90.
+
+86
+00:08:18,940 --> 00:08:24,940
+And then I'm going to mirror it on the Y.
+
+87
+00:08:28,940 --> 00:08:31,660
+Okay.
+
+88
+00:08:31,660 --> 00:08:34,700
+So then I can take garage C.
+
+89
+00:08:34,740 --> 00:08:43,740
+I can mix and match these, but I'll just duplicate this collection here and then move the garage over.
+
+90
+00:08:47,740 --> 00:08:52,740
+Let's see if we got the garage located at the correct side.
+
+91
+00:08:52,740 --> 00:08:57,740
+So I think we're going to turn this around.
+
+92
+00:09:00,740 --> 00:09:02,740
+Do 180.
+
+93
+00:09:04,740 --> 00:09:11,740
+And I'm going to mirror it on the Y.
+
+94
+00:09:11,740 --> 00:09:15,740
+So the door is closer to the house there.
+
+95
+00:09:15,740 --> 00:09:21,420
+So I'm going to do that concept then with all these other housing types and garage types
+
+96
+00:09:21,420 --> 00:09:25,540
+and lay out this entire site then.
+
+97
+00:09:25,540 --> 00:09:33,660
+So once we have everything in position and plan, we can select the house and the garage
+
+98
+00:09:33,660 --> 00:09:43,660
+and move them down in elevation so they work better with the existing topography.
+
+99
+00:09:50,660 --> 00:09:52,660
+I'm going to bring this down to 4.
+
+100
+00:09:52,660 --> 00:09:56,660
+So I'm going to do Alt in there, negative 4.
+
+101
+00:09:56,660 --> 00:09:59,660
+That brings both of the objects down.
+
+102
+00:10:00,660 --> 00:10:02,660
+So you can do the same here.
+
+103
+00:10:05,660 --> 00:10:07,660
+Bring it down.
+
+104
+00:10:09,660 --> 00:10:11,660
+It'll be 6 feet.
+
+105
+00:10:13,660 --> 00:10:14,660
+That's good.
+
+106
+00:10:14,660 --> 00:10:15,660
+Yep.
+
+107
+00:10:15,660 --> 00:10:18,660
+Alt, negative 6 feet.
+
+108
+00:10:19,660 --> 00:10:23,660
+So I'm going to do that with the rest of these houses then.
+
+109
+00:10:24,660 --> 00:10:31,660
+So now that everything's in place, what happens if you make a change and you'd like to have
+
+110
+00:10:31,660 --> 00:10:35,660
+that change propagated to the rest of those housing types then?
+
+111
+00:10:35,660 --> 00:10:43,660
+So for example, let's say this piece of furniture is going to be rotated 45 degrees.
+
+112
+00:10:43,660 --> 00:10:46,660
+So we'll save the blend file.
+
+113
+00:10:46,660 --> 00:10:51,660
+So when we do this, it saves both the blend file and the IFC file together.
+
+114
+00:10:54,660 --> 00:11:01,660
+We go to our folder and we're going to delete this copy.
+
+115
+00:11:03,660 --> 00:11:08,660
+And then we're going to copy this and we're going to paste it and create another copy
+
+116
+00:11:08,660 --> 00:11:12,660
+with the updated file.
+
+117
+00:11:12,660 --> 00:11:19,660
+So go back to your file then and we're going to switch this to a Blender file.
+
+118
+00:11:20,660 --> 00:11:23,660
+So the display mode, we're going to go to Blender file.
+
+119
+00:11:23,660 --> 00:11:27,660
+And this is our linked blend file.
+
+120
+00:11:27,660 --> 00:11:31,660
+So we're going to right click and then we're going to reload.
+
+121
+00:11:38,660 --> 00:11:47,660
+So it will take some time, but after a while, you can see that that change has been propagated
+
+122
+00:11:47,660 --> 00:11:52,660
+to all these linked housing types.
+
diff --git a/130000_20250530_1436 - Creating the site plan/130000_20250530_1436 - Creating the site plan.srt b/130000_20250530_1436 - Creating the site plan/130000_20250530_1436 - Creating the site plan.srt
new file mode 100644
index 0000000..96cc9be
--- /dev/null
+++ b/130000_20250530_1436 - Creating the site plan/130000_20250530_1436 - Creating the site plan.srt
@@ -0,0 +1,408 @@
+1
+00:00:00,000 --> 00:00:05,680
+Now that we're saving both the blend file and IFC file together, we're not going to use this
+
+2
+00:00:05,680 --> 00:00:10,720
+open IFC project anymore. We would go down here and use these instead.
+
+3
+00:00:10,720 --> 00:00:14,560
+So I'm just going to say open reset and open the blend file.
+
+4
+00:00:17,680 --> 00:00:24,240
+So as you can see, I created a new site plan. I just duplicated the first floor plan,
+
+5
+00:00:24,240 --> 00:00:30,880
+just enlarged it there. If you go to the exclude filters, you can kind of see
+
+6
+00:00:32,400 --> 00:00:37,360
+what other filters I added here. So I turned off all the reference planes
+
+7
+00:00:39,360 --> 00:00:46,400
+in the reference section and then the section and elevation tags I turned off as well.
+
+8
+00:00:46,400 --> 00:00:55,440
+So just so if we create another site plan, we don't have to redo this again.
+
+9
+00:00:55,440 --> 00:01:00,560
+Let's create or save the exclude filter. Just call it site.
+
+10
+00:01:07,200 --> 00:01:09,120
+So let's run the drawing then.
+
+11
+00:01:13,440 --> 00:01:15,600
+So here's what the drawing looks like so far.
+
+12
+00:01:16,400 --> 00:01:22,480
+Obviously, our terrain is all faceted and we probably don't want that in the final drawing.
+
+13
+00:01:23,680 --> 00:01:29,840
+And our property lines and setbacks here are a solid line.
+
+14
+00:01:29,840 --> 00:01:34,000
+And let's try to figure out how to change that to a more dashed line.
+
+15
+00:01:35,600 --> 00:01:43,680
+So again, we go to our default CSS file and open that in our
+
+16
+00:01:44,080 --> 00:01:52,080
+favorite text editor. And I've done this off of camera here. I've added these rules.
+
+17
+00:01:52,080 --> 00:02:00,160
+So this is the rule we're going to use to turn off the faceting for the terrain.
+
+18
+00:02:00,160 --> 00:02:10,240
+So if the object has this class and this class as well as this class, then we're going to
+
+19
+00:02:10,640 --> 00:02:18,080
+turn the stroke off or the stroke is none. So I'm going to remove the comments here.
+
+20
+00:02:25,040 --> 00:02:25,760
+And down here,
+
+21
+00:02:31,440 --> 00:02:37,680
+our assignments to give our property lines and setbacks a styling that we want.
+
+22
+00:02:41,200 --> 00:02:51,600
+So again, if you inspect an element in Chrome or any type of browser,
+
+23
+00:02:54,320 --> 00:03:00,320
+you can see what kind of classes are attached to it. And we use those classes then in this
+
+24
+00:03:00,320 --> 00:03:08,960
+CSS file. So I'm going to save those changes there. Go back to our blend file and then rerun
+
+25
+00:03:09,280 --> 00:03:10,480
+it and see what it looks like.
+
+26
+00:03:15,680 --> 00:03:18,640
+So the faceting has gone off the terrain then,
+
+27
+00:03:18,640 --> 00:03:23,760
+and we have some dashed lines for our property lines and setbacks. So that's good.
+
+28
+00:03:29,760 --> 00:03:36,880
+So let's rotate this site plan. So when we put it on our sheet, that it is more of a longitudinal
+
+29
+00:03:36,880 --> 00:03:44,400
+versus a portrait orientation. So if you take note of our width and height here,
+
+30
+00:03:45,600 --> 00:03:48,560
+let's just select the drawing and turn it.
+
+31
+00:03:52,480 --> 00:03:53,840
+And flip these then.
+
+32
+00:03:53,840 --> 00:04:06,880
+So when we place this on our drawing, then it works with our landscape sheet then.
+
+33
+00:04:12,560 --> 00:04:19,680
+So this terrain object that we spent a lot of time making, we're going to ultimately modify this
+
+34
+00:04:20,560 --> 00:04:25,440
+to adjust the topography around the house. So in anticipation of that,
+
+35
+00:04:25,440 --> 00:04:33,760
+I'm just going to duplicate this. So we always have original topography.
+
+36
+00:04:33,760 --> 00:04:37,760
+So we're going to use that to compare against in the future. So I'm just going to move it off like
+
+37
+00:04:38,560 --> 00:04:39,440
+a thousand feet.
+
+38
+00:04:39,440 --> 00:04:49,600
+And then I'm going to change the style that's attached to this object
+
+39
+00:04:53,200 --> 00:04:57,040
+just so it's not so chromatic when we do our drawings.
+
+40
+00:04:58,800 --> 00:05:04,080
+I'm going to give it a grass style. And that style I added off camera.
+
+41
+00:05:09,440 --> 00:05:13,600
+If we go back to the drawing.
+
+42
+00:05:26,720 --> 00:05:27,600
+And we rerun it.
+
+43
+00:05:28,160 --> 00:05:37,360
+So you'll notice that the colors on this floor plan are pretty chromatic. They're pretty rich.
+
+44
+00:05:37,360 --> 00:05:45,120
+And so it's kind of hard to read the drawing. So a lot of times I like to create a new shading
+
+45
+00:05:45,120 --> 00:05:51,040
+style for floor plans where it tones down the colors a little bit. So right now you can see
+
+46
+00:05:51,040 --> 00:05:56,720
+the current shading styles that are Blender default. So I'm going to go ahead and change
+
+47
+00:05:56,720 --> 00:06:00,160
+Blender default that we worked on a couple of videos ago.
+
+48
+00:06:00,160 --> 00:06:08,480
+So I want to create a new style just for floor plans. And let's do add.
+
+49
+00:06:11,440 --> 00:06:12,880
+And I'm going to just call it plan.
+
+50
+00:06:18,640 --> 00:06:22,240
+And then I'm going to activate the drawing style so it's applied to.
+
+51
+00:06:22,240 --> 00:06:30,240
+So right now plan is the same as Blender default. But now I want to
+
+52
+00:06:32,720 --> 00:06:36,080
+change some of the colored readouts here. And I'm just going to mess with these.
+
+53
+00:06:38,400 --> 00:06:44,080
+Okay, first I got to see lights.
+
+54
+00:06:44,080 --> 00:06:55,760
+Okay, so it's a matter of just messing around with these variables
+
+55
+00:06:57,200 --> 00:07:03,599
+till you get it where the colors are a little washed out. So I'm just going to pick some value
+
+56
+00:07:03,599 --> 00:07:10,960
+and say that's good. Go back to our drawings. And now I'm going to update, click on plan,
+
+57
+00:07:11,200 --> 00:07:18,400
+and save drawing style. And now we'll rerun the drawing, see what it looks like.
+
+58
+00:07:21,440 --> 00:07:29,039
+Oh, it's still pretty rich. So again, go back and modify these.
+
+59
+00:07:40,960 --> 00:07:47,599
+Save the style again.
+
+60
+00:07:51,760 --> 00:07:52,960
+And then rerun the drawing.
+
+61
+00:07:55,680 --> 00:08:02,080
+So it's getting better. I'll tweak more the settings offline, but you kind of get the idea.
+
+62
+00:08:05,440 --> 00:08:08,880
+So one thing you've probably noticed, and I haven't brought it up yet, is that
+
+63
+00:08:09,680 --> 00:08:18,000
+there's only cut lines, black cut lines, for our objects that are in the IFC file and not
+
+64
+00:08:18,800 --> 00:08:29,760
+the linked Blender files. So there's a way to run our drawings and have the line work
+
+65
+00:08:29,760 --> 00:08:36,799
+work for these Blender files here as well. You change this mode here, the line work mode,
+
+66
+00:08:37,679 --> 00:08:44,400
+to freestyle. And you'll notice our to run the drawing is grayed out.
+
+67
+00:08:45,439 --> 00:08:50,560
+It's because it's telling you the freestyle SVG exporter extension needs to be installed.
+
+68
+00:08:51,280 --> 00:08:58,800
+So let's do that. Go to preferences and search freestyle.
+
+69
+00:09:01,599 --> 00:09:02,319
+And install.
+
+70
+00:09:07,439 --> 00:09:09,599
+So once it's installed, if you go back,
+
+71
+00:09:11,359 --> 00:09:16,800
+oh, I guess it didn't activate. Sometimes it doesn't activate right away. And so if that is
+
+72
+00:09:16,800 --> 00:09:28,000
+the case, you would go to add-ons here and find where it's at right here. And you would just
+
+73
+00:09:28,000 --> 00:09:33,439
+toggle this on and off just to activate it. But it looks like it got activated already.
+
+74
+00:09:34,240 --> 00:09:42,320
+So with that line style mode freestyle, let's try the drawing again. See what it looks like.
+
+75
+00:09:46,080 --> 00:09:49,920
+So now you can see that we have lines then on our Blender file.
+
+76
+00:09:53,440 --> 00:09:59,440
+You'll notice, unfortunately, running the drawings in this mode,
+
+77
+00:10:00,080 --> 00:10:06,320
+you lose the ability to style projection lines. So if I wanted to say turn that blue
+
+78
+00:10:07,520 --> 00:10:13,280
+with my CSS style, I cannot do that. You can still style cut lines,
+
+79
+00:10:14,720 --> 00:10:18,400
+but you cannot style projection lines, unfortunately.
+
+80
+00:10:19,760 --> 00:10:26,160
+So you notice these houses to the right of the site. It's not cutting the door properly.
+
+81
+00:10:26,880 --> 00:10:34,959
+It's actually the cut level is above the door. So as a little hack in order to fix that,
+
+82
+00:10:34,959 --> 00:10:39,360
+I'm going to create two drawings, one for the right of the site and one for the left of the
+
+83
+00:10:39,360 --> 00:10:46,400
+site. And the drawing camera is going to be at different Z dimensions. And then I'll run both
+
+84
+00:10:46,400 --> 00:10:51,040
+of those drawings and then place them on the sheet and just put them next to each other. So we have
+
+85
+00:10:51,040 --> 00:10:59,920
+then a floor plan or site plan that cuts at the first floor for the entire site. So just to do
+
+86
+00:10:59,920 --> 00:11:11,599
+that, select the camera and divide by two of the width and move it over. I'm going to turn on the
+
+87
+00:11:11,599 --> 00:11:19,680
+wireframe here so I can see what's going on better and just start going down to a point that
+
+88
+00:11:19,680 --> 00:11:32,719
+makes sense. Let's try that level. It's about two and a half down. So then run the drawing.
+
+89
+00:11:37,040 --> 00:11:43,760
+So this will be the right hand side of our site plan. So off camera, I created these two site
+
+90
+00:11:43,760 --> 00:11:50,880
+plans, the left and the right, and re-ran the drawings. This is what the right site looks like
+
+91
+00:11:51,920 --> 00:11:57,920
+in the left here. So let's place those on a sheet then, create a new sheet.
+
+92
+00:11:57,920 --> 00:12:06,959
+Let's just say A100.
+
+93
+00:12:12,959 --> 00:12:20,479
+Site plan. And place this one first and this one second.
+
+94
+00:12:23,360 --> 00:12:27,360
+See if they're both on there. Then run the drawing, see what it looks like.
+
+95
+00:12:27,920 --> 00:12:41,360
+We obviously have to open it up in Inkscape to adjust our layout. So open the layout.
+
+96
+00:12:49,360 --> 00:12:55,839
+So then adjust the location of these. So the right and left align with each other.
+
+97
+00:12:55,840 --> 00:13:03,280
+We can take our time more so later but just get kind of close.
+
+98
+00:13:14,480 --> 00:13:18,240
+That's good for now. And we can actually double click into here.
+
+99
+00:13:18,240 --> 00:13:24,000
+If we can.
+
+100
+00:13:27,600 --> 00:13:31,920
+We're just going to move one of these off just so it doesn't show up in the site plan
+
+101
+00:13:31,920 --> 00:13:38,160
+or the sheet. And we'll save and re-run the sheet and see what it looks like.
+
+102
+00:13:43,760 --> 00:13:44,640
+So we're getting close.
+
diff --git a/131000_20250630_1310 - Style drawings based on the materials category and layers material name/131000_20250630_1310 - Style drawings based on the materials category and layers material name.srt b/131000_20250630_1310 - Style drawings based on the materials category and layers material name/131000_20250630_1310 - Style drawings based on the materials category and layers material name.srt
new file mode 100644
index 0000000..a61f372
--- /dev/null
+++ b/131000_20250630_1310 - Style drawings based on the materials category and layers material name/131000_20250630_1310 - Style drawings based on the materials category and layers material name.srt
@@ -0,0 +1,376 @@
+1
+00:00:00,000 --> 00:00:04,080
+So just to summarize if we're looking at our Bonsai tutorial repo here
+
+2
+00:00:04,940 --> 00:00:09,940
+we had pulled in the OD textures and the P sets as
+
+3
+00:00:11,120 --> 00:00:15,380
+Submodules so sub modules again are repos within repos
+
+4
+00:00:15,900 --> 00:00:19,520
+So if we click on the OD texture it points to another repo
+
+5
+00:00:21,880 --> 00:00:27,760
+And similarly go to P sets it points to another repo and so conceptually I
+
+6
+00:00:28,760 --> 00:00:32,300
+Do this so I can keep
+
+7
+00:00:33,920 --> 00:00:39,860
+Track of a one set of standards of one location that then I can sync into every project
+
+8
+00:00:40,440 --> 00:00:42,440
+so similarly then I
+
+9
+00:00:44,480 --> 00:00:46,480
+Just recently
+
+10
+00:00:46,560 --> 00:00:52,940
+Synced in the assets some module here that I've been working on if you look at the commits here
+
+11
+00:00:53,340 --> 00:00:55,340
+over the last year or so
+
+12
+00:00:56,140 --> 00:00:59,420
+So as I'm working on a project I tweak say
+
+13
+00:01:01,400 --> 00:01:06,940
+You know the default CSS or the or the patterns file or the shading styles
+
+14
+00:01:06,940 --> 00:01:13,180
+And so every project these get tweaked a little bit and so I'd save it and then sync it back to
+
+15
+00:01:14,060 --> 00:01:21,560
+This centralized repo basically. There's just a way to evolve your standards over time. So again, I
+
+16
+00:01:22,380 --> 00:01:24,100
+sync that again
+
+17
+00:01:24,100 --> 00:01:25,699
+Into
+
+18
+00:01:25,699 --> 00:01:28,020
+our Bonsai tutorial repo
+
+19
+00:01:28,660 --> 00:01:30,660
+Just like these other two
+
+20
+00:01:30,940 --> 00:01:35,280
+If we go back to our file and we run this drawing here
+
+21
+00:01:35,280 --> 00:01:39,720
+I want to show you some additional approaches to how to style your drawing
+
+22
+00:01:43,020 --> 00:01:48,240
+So if you remember here if we select that wall concrete wall
+
+23
+00:01:49,220 --> 00:01:51,660
+And we inspect it here
+
+24
+00:01:51,660 --> 00:01:59,100
+We are using dot material slash concrete here that class to style it if
+
+25
+00:02:00,259 --> 00:02:02,259
+you remember
+
+26
+00:02:02,340 --> 00:02:04,340
+that information is
+
+27
+00:02:05,380 --> 00:02:07,179
+coming from
+
+28
+00:02:07,179 --> 00:02:09,180
+the name of the layer set
+
+29
+00:02:10,259 --> 00:02:12,260
+Concrete here that we did before
+
+30
+00:02:14,240 --> 00:02:17,220
+Okay, so let's say we want to
+
+31
+00:02:18,579 --> 00:02:20,579
+style off a different criteria
+
+32
+00:02:21,660 --> 00:02:23,660
+What if like a
+
+33
+00:02:23,900 --> 00:02:31,380
+Material has a category. Let's say our material is 8 inch concrete wall, but the category is
+
+34
+00:02:32,420 --> 00:02:33,660
+concrete
+
+35
+00:02:33,660 --> 00:02:36,260
+So for example here this footing I
+
+36
+00:02:37,260 --> 00:02:41,100
+Select it the materials concrete footing. So if I search that
+
+37
+00:02:42,140 --> 00:02:44,140
+here
+
+38
+00:02:45,620 --> 00:02:47,620
+Footing
+
+39
+00:02:48,500 --> 00:02:56,420
+Okay, I got it there the category here is concrete, okay, so let's say we want to style relative to that instead
+
+40
+00:03:05,900 --> 00:03:09,340
+So again going back to our selector syntax
+
+41
+00:03:10,540 --> 00:03:12,540
+documentation that we know and love
+
+42
+00:03:13,380 --> 00:03:15,380
+I'm going to use this mats here
+
+43
+00:03:15,900 --> 00:03:18,180
+To start trying to pull out
+
+44
+00:03:18,900 --> 00:03:20,900
+more information on the materials
+
+45
+00:03:21,299 --> 00:03:24,180
+So go back to the drawing
+
+46
+00:03:37,260 --> 00:03:39,260
+We're going to change the metadata
+
+47
+00:03:45,859 --> 00:03:47,859
+Say comma
+
+48
+00:03:48,160 --> 00:03:50,160
+mats dot
+
+49
+00:03:50,660 --> 00:03:56,260
+Cat a glory so we want the category of the materials we say
+
+50
+00:03:57,780 --> 00:04:01,700
+Okay, and then let's just run this drawing again
+
+51
+00:04:08,140 --> 00:04:13,180
+We zoom in on our footing here we have now a concrete texture so if I inspect that
+
+52
+00:04:14,180 --> 00:04:18,780
+Let's see what classes I'm going to go up one level there
+
+53
+00:04:20,220 --> 00:04:23,740
+So it's pushed out now differently
+
+54
+00:04:24,940 --> 00:04:30,340
+This style here, and you can see we have a style in our default CSS
+
+55
+00:04:30,980 --> 00:04:37,140
+That's already tied to that. So if you look go back to our default CSS
+
+56
+00:04:38,820 --> 00:04:40,820
+This is the rule here
+
+57
+00:04:43,180 --> 00:04:45,180
+You
+
+58
+00:04:48,260 --> 00:04:50,860
+So if you zoom out and compare
+
+59
+00:04:51,940 --> 00:04:53,940
+the before and after
+
+60
+00:04:54,460 --> 00:05:02,980
+This is the before and after you can see some other objects have changed one being this installation here
+
+61
+00:05:04,380 --> 00:05:10,060
+Used to be blocked out that way and now it has a pattern associated with it. So if we inspect that
+
+62
+00:05:10,060 --> 00:05:15,500
+We can see the style or the
+
+63
+00:05:17,060 --> 00:05:20,940
+The class that's assigned to it and then we can
+
+64
+00:05:21,740 --> 00:05:23,740
+basically find that in our
+
+65
+00:05:24,740 --> 00:05:26,740
+default CSS
+
+66
+00:05:27,380 --> 00:05:29,380
+And there it is
+
+67
+00:05:31,980 --> 00:05:33,980
+If we run this drawing again
+
+68
+00:05:36,280 --> 00:05:39,580
+We zoom into that concrete wall
+
+69
+00:05:40,580 --> 00:05:46,020
+And if you remember that concrete wall is as multiple layers
+
+70
+00:05:47,540 --> 00:05:54,180
+The outer layers rigid insulation and inner layers concrete, but unfortunately, they're both showing concrete right now
+
+71
+00:05:55,300 --> 00:05:59,140
+So let's inspect that outer layer and take a look at it
+
+72
+00:06:00,980 --> 00:06:07,700
+So because we changed our metadata to Matt's category it's exporting out
+
+73
+00:06:07,700 --> 00:06:10,780
+This style here
+
+74
+00:06:12,900 --> 00:06:16,539
+But if we take this style, I'm just gonna add it in here's
+
+75
+00:06:17,460 --> 00:06:22,659
+Dot and we're just gonna give it a fill just read for now. You can see
+
+76
+00:06:24,380 --> 00:06:31,919
+So unfortunately it fills the entire wall again and that's not what we want
+
+77
+00:06:33,099 --> 00:06:35,219
+What we want instead is to use
+
+78
+00:06:36,180 --> 00:06:42,000
+This class that has a prefix layer material and as you can see it has
+
+79
+00:06:42,460 --> 00:06:50,820
+The entire name of the material after it. So unfortunately bonsai at this point doesn't allow you to
+
+80
+00:06:53,740 --> 00:06:56,500
+Assign via the
+
+81
+00:06:58,140 --> 00:07:04,900
+Layers material category so you have to just basically do the whole name instead
+
+82
+00:07:06,180 --> 00:07:12,900
+I'm sure that'll be changed in the future. But now unfortunately that's the case. So let's copy that class and
+
+83
+00:07:13,700 --> 00:07:17,580
+Let's just try it to see what it looks like here. I'll do fill
+
+84
+00:07:20,180 --> 00:07:22,180
+And then blue
+
+85
+00:07:22,260 --> 00:07:24,660
+So there you see it changes different
+
+86
+00:07:25,340 --> 00:07:28,100
+so what we got to do then is just
+
+87
+00:07:28,620 --> 00:07:30,620
+Copy the class
+
+88
+00:07:30,620 --> 00:07:35,340
+Go to our default CSS here and
+
+89
+00:07:37,700 --> 00:07:40,460
+We're just gonna put it here I'm gonna do
+
+90
+00:07:41,860 --> 00:07:44,140
+Comma and dot the class
+
+91
+00:07:45,100 --> 00:07:47,100
+So these are basically two classes
+
+92
+00:07:48,500 --> 00:07:54,580
+Separated by you know a comma there and it's got a fill that pink fill so I'm going to save it
+
+93
+00:07:55,780 --> 00:07:57,780
+Go back to the drawing and then rerun it
+
+94
+00:08:00,620 --> 00:08:04,820
+So there you go zoom in and the insulation is paint there
+
diff --git a/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag.srt b/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag.srt
new file mode 100644
index 0000000..6ff3a2a
--- /dev/null
+++ b/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag.srt
@@ -0,0 +1,136 @@
+1
+00:00:00,000 --> 00:00:04,500
+So you'll notice if I zoom into this footing here that it overlaps the slab a
+
+2
+00:00:04,500 --> 00:00:10,700
+little bit. We ultimately want a drawing where that slab is notched out so we
+
+3
+00:00:10,700 --> 00:00:16,780
+could we could actually apply a void to that slab to carve out that little notch
+
+4
+00:00:16,780 --> 00:00:25,800
+or there's a way through drawing parameters to tell Bonsai to bring
+
+5
+00:00:25,800 --> 00:00:31,440
+certain objects forward or bring to the front. So if I just run this right now
+
+6
+00:00:31,440 --> 00:00:36,240
+just to see what the precondition is
+
+7
+00:00:38,520 --> 00:00:46,360
+you zoom in on that footing there so you can see there the slab notches into the
+
+8
+00:00:46,360 --> 00:00:51,519
+footing and we want the other way around. So go back to Bonsai we want to select
+
+9
+00:00:51,560 --> 00:00:57,400
+the drawing and go to the properties and we're going to use this bring to front
+
+10
+00:00:57,400 --> 00:01:04,200
+property here and we're going to say take every IFC footing and bring it to
+
+11
+00:01:04,200 --> 00:01:10,440
+the front and you can add other classes here if you want just add a comma and
+
+12
+00:01:10,440 --> 00:01:18,280
+just type the additional class and so you can say okay and then rerun the
+
+13
+00:01:18,280 --> 00:01:20,560
+drawing
+
+14
+00:01:21,520 --> 00:01:25,280
+zoom in on the footing so there you go the footing it's brought to the front
+
+15
+00:01:25,280 --> 00:01:31,660
+there. So up to this point we've been using these leader lines to pull out
+
+16
+00:01:31,660 --> 00:01:35,800
+information from these various objects such as the material name or the category
+
+17
+00:01:35,800 --> 00:01:42,399
+or the type description. You'll see this leader line here it's pointing to what
+
+18
+00:01:42,399 --> 00:01:48,039
+is essentially just a dumb 2D line that I drew in on the drawing so there's
+
+19
+00:01:48,040 --> 00:01:53,960
+really no intelligent objects for it to pull off if you're relative to that line
+
+20
+00:01:53,960 --> 00:01:59,000
+but this leader line is still intelligent and I'll show you how I did
+
+21
+00:01:59,000 --> 00:02:05,640
+that. Essentially you just create an empty with an object with no geometry
+
+22
+00:02:05,640 --> 00:02:14,920
+and then tie that leader to that object so you go to add IFC element and we'll
+
+23
+00:02:14,920 --> 00:02:24,980
+just call it testing description element and we're gonna go
+
+24
+00:02:24,980 --> 00:02:36,359
+virtual and then no geometry so let's say okay and then I like to just put
+
+25
+00:02:36,360 --> 00:02:45,840
+that empty at the origin just so it's nice and tidy and then we'll put the
+
+26
+00:02:45,840 --> 00:02:50,720
+leader line out there untyped.
+
+27
+00:02:50,720 --> 00:03:16,060
+And we'll change this to description with our curly brackets. Okay now we
+
+28
+00:03:16,060 --> 00:03:24,940
+have to attach that leader to the empty so I'm just gonna look up testing there
+
+29
+00:03:24,940 --> 00:03:36,640
+and do the pencil and the eyedropper and say okay so there yes it's pulling out
+
+30
+00:03:36,640 --> 00:03:41,740
+the description from that empty so you can have you know this leader on
+
+31
+00:03:41,740 --> 00:03:51,360
+multiple sheets and multiple times in one drawing and you can go back to that
+
+32
+00:03:51,360 --> 00:03:57,620
+empty and just change the description and then all those leaders should update
+
+33
+00:03:57,620 --> 00:04:05,020
+so it's just a way to get around or still realize intelligent leaders
+
+34
+00:04:05,020 --> 00:04:10,660
+without having a you know geometry to attach it to
+
diff --git a/133000_20250701_1241 - Using pre-made SVG patterns from the web/133000_20250701_1241 - Using pre-made SVG patterns from the web.srt b/133000_20250701_1241 - Using pre-made SVG patterns from the web/133000_20250701_1241 - Using pre-made SVG patterns from the web.srt
new file mode 100644
index 0000000..59eb7d5
--- /dev/null
+++ b/133000_20250701_1241 - Using pre-made SVG patterns from the web/133000_20250701_1241 - Using pre-made SVG patterns from the web.srt
@@ -0,0 +1,236 @@
+1
+00:00:00,000 --> 00:00:07,200
+If we open this drawing here, the one we've been working on, we scroll down to the layer
+
+2
+00:00:07,200 --> 00:00:09,060
+underneath the slab.
+
+3
+00:00:09,060 --> 00:00:13,200
+That layer is the gravel layer, the compacted gravel.
+
+4
+00:00:13,200 --> 00:00:20,100
+We don't have a pattern yet in our assets folder for gravel.
+
+5
+00:00:20,100 --> 00:00:24,700
+So we could either make one like an Inkscape or whatever, or there's another option where
+
+6
+00:00:24,700 --> 00:00:30,180
+you can actually just pull down an SVG pattern from the web.
+
+7
+00:00:30,180 --> 00:00:36,740
+And so there's a number of sources out there if you just want to search SVG pattern.
+
+8
+00:00:36,740 --> 00:00:37,820
+Here's a couple of sites.
+
+9
+00:00:37,820 --> 00:00:42,700
+I like to use this pattern monster here.
+
+10
+00:00:42,700 --> 00:00:51,860
+You can see there's various different options you can use.
+
+11
+00:00:51,860 --> 00:00:56,780
+So I've kind of off camera found the one that I kind of like.
+
+12
+00:00:56,780 --> 00:01:04,860
+And you can click on Inspire Me to get different pattern variations and change certain things.
+
+13
+00:01:04,860 --> 00:01:09,660
+So ultimately, I settled on this pattern here.
+
+14
+00:01:09,660 --> 00:01:15,420
+And so you can say Copy SVG into your clipboard.
+
+15
+00:01:15,420 --> 00:01:24,740
+And then go to your patterns SVG file here in your assets folder.
+
+16
+00:01:24,740 --> 00:01:34,860
+And you'll scroll through the document to kind of see the patterns essentially that
+
+17
+00:01:34,860 --> 00:01:36,980
+the file is following.
+
+18
+00:01:36,980 --> 00:01:45,620
+So it looks like every new pattern is surrounded by a pattern tag.
+
+19
+00:01:45,620 --> 00:01:50,080
+And then every pattern has an ID and some other stuff.
+
+20
+00:01:50,080 --> 00:01:55,260
+So there's certain patterns within the pattern file that we want to follow.
+
+21
+00:01:55,260 --> 00:02:02,400
+So I'm going to take that copy and paste, and I'm just going to paste it in here.
+
+22
+00:02:02,400 --> 00:02:10,420
+And I'm just going to format this just so it's easier to see.
+
+23
+00:02:10,420 --> 00:02:16,240
+So here you can see the copy and paste already has kind of that pattern established.
+
+24
+00:02:16,240 --> 00:02:22,480
+So we want to just get rid of those tags.
+
+25
+00:02:22,480 --> 00:02:28,380
+And again, format it.
+
+26
+00:02:28,380 --> 00:02:30,400
+And we want to give it an ID.
+
+27
+00:02:30,400 --> 00:02:34,400
+So we'll say gravel.
+
+28
+00:02:34,400 --> 00:02:39,720
+And it looks like all this other stuff.
+
+29
+00:02:39,720 --> 00:02:40,720
+This changes scale.
+
+30
+00:02:40,720 --> 00:02:45,680
+I know from working on this before, the scale is going to be way off.
+
+31
+00:02:45,680 --> 00:02:47,320
+So I'm going to change it to 01.
+
+32
+00:02:47,320 --> 00:02:51,620
+And I'm going to save it.
+
+33
+00:02:51,620 --> 00:03:02,060
+And then in our default CSS, then we have to create a new rule to point to that pattern.
+
+34
+00:03:02,060 --> 00:03:04,220
+And so I kind of made it off camera.
+
+35
+00:03:04,220 --> 00:03:05,220
+Here's that rule.
+
+36
+00:03:05,220 --> 00:03:08,700
+I'm just going to get rid of the comments here.
+
+37
+00:03:08,700 --> 00:03:12,460
+So it's materials category slash gravel on the fill.
+
+38
+00:03:12,460 --> 00:03:18,820
+And this means it's pointing to that pattern in the patterns SVG.
+
+39
+00:03:18,820 --> 00:03:21,739
+So I'm going to save that.
+
+40
+00:03:21,739 --> 00:03:29,500
+And so now going back to the bonsai file, if we run the drawing, hopefully that pattern
+
+41
+00:03:29,500 --> 00:03:38,140
+will show up in the gravel base.
+
+42
+00:03:38,140 --> 00:03:39,579
+So it did not show up.
+
+43
+00:03:39,579 --> 00:03:40,579
+What did it?
+
+44
+00:03:40,579 --> 00:03:41,579
+Yes, it did.
+
+45
+00:03:41,579 --> 00:03:44,540
+It was just too small.
+
+46
+00:03:44,540 --> 00:03:50,820
+So you just go back to your patterns file there.
+
+47
+00:03:50,820 --> 00:03:52,500
+And let's just change the scale.
+
+48
+00:03:52,500 --> 00:03:54,500
+I think it went too small.
+
+49
+00:03:54,500 --> 00:03:55,500
+The 0.1.
+
+50
+00:03:55,500 --> 00:04:03,260
+And go back and run it.
+
+51
+00:04:03,260 --> 00:04:05,180
+There you go.
+
+52
+00:04:05,180 --> 00:04:11,340
+So you can, just like the other fills and patterns, you can change these colors too,
+
+53
+00:04:11,340 --> 00:04:13,620
+if you'd like.
+
+54
+00:04:13,620 --> 00:04:18,540
+You know, that's the fill color and then the stroke color.
+
+55
+00:04:18,540 --> 00:04:26,340
+So if you want to change that to red or whatever, certainly can.
+
+56
+00:04:26,340 --> 00:04:27,340
+Save it and then run it again.
+
+57
+00:04:27,340 --> 00:04:28,340
+See what happens.
+
+58
+00:04:28,340 --> 00:04:29,340
+There you go.
+
+59
+00:04:29,340 --> 00:04:30,340
+Red gravel.
+
diff --git a/134000_20250701_1353 - Adding external SVG files to sheets/134000_20250701_1353 - Adding external SVG files to sheets.srt b/134000_20250701_1353 - Adding external SVG files to sheets/134000_20250701_1353 - Adding external SVG files to sheets.srt
new file mode 100644
index 0000000..cfba3fc
--- /dev/null
+++ b/134000_20250701_1353 - Adding external SVG files to sheets/134000_20250701_1353 - Adding external SVG files to sheets.srt
@@ -0,0 +1,52 @@
+1
+00:00:00,000 --> 00:00:08,240
+So what if there's documentation like a jpeg or an SVG that's outside of the bonsai file that you
+
+2
+00:00:08,240 --> 00:00:15,520
+would like to place on an individual sheet. So you can do that. So here as an example I just have a
+
+3
+00:00:15,520 --> 00:00:22,320
+vicinity map. I pulled this jpeg off of Google Earth and then just you know marked the project
+
+4
+00:00:22,320 --> 00:00:32,640
+location and so I just saved it and I created a new folder called references. It can be whatever
+
+5
+00:00:32,640 --> 00:00:37,920
+you want to call it but here's the jpeg. You don't necessarily need that anymore and then here's the
+
+6
+00:00:38,640 --> 00:00:48,800
+SVG. So you can only bring in SVGs and not JPEGs. So in bonsai then you go to your drawing panel
+
+7
+00:00:48,800 --> 00:00:51,919
+and go down to references here and
+
+8
+00:00:54,800 --> 00:01:02,239
+we want to add a reference and it's asking where it's located and so you just navigate to it.
+
+9
+00:01:03,920 --> 00:01:12,000
+References, add reference. So there it adds it and so then to add it to a sheet
+
+10
+00:01:12,880 --> 00:01:21,280
+similar process. I created a new sheet here project info. I do believe it is is it this one
+
+11
+00:01:22,160 --> 00:01:28,000
+yeah add reference. So click on that have it highlighted down low though before you do that
+
+12
+00:01:28,800 --> 00:01:31,760
+and then it will run it to see if it added.
+
+13
+00:01:36,080 --> 00:01:37,920
+So there it added it to the sheet then.
+
diff --git a/135000_20250701_1440 - Modifying the sites topography/135000_20250701_1440 - Modifying the sites topography.srt b/135000_20250701_1440 - Modifying the sites topography/135000_20250701_1440 - Modifying the sites topography.srt
new file mode 100644
index 0000000..d20dd11
--- /dev/null
+++ b/135000_20250701_1440 - Modifying the sites topography/135000_20250701_1440 - Modifying the sites topography.srt
@@ -0,0 +1,280 @@
+1
+00:00:00,000 --> 00:00:04,220
+So now that we have the houses positioned where we want them on the site
+
+2
+00:00:04,800 --> 00:00:08,620
+Let's modify this existing topography then to
+
+3
+00:00:10,660 --> 00:00:15,140
+Match up or work with the elevations of the various houses
+
+4
+00:00:16,160 --> 00:00:24,440
+So off-camera, I took this if you remember this topography here was one big mesh and I
+
+5
+00:00:25,000 --> 00:00:27,000
+separated into two meshes
+
+6
+00:00:27,000 --> 00:00:31,100
+This outside mesh and then this inside mesh that has a kind of a more dense
+
+7
+00:00:34,040 --> 00:00:35,600
+Triangulation to it
+
+8
+00:00:35,600 --> 00:00:39,360
+The the reason I separated is because at the boundary of the site
+
+9
+00:00:40,120 --> 00:00:42,720
+Typically that should not change in
+
+10
+00:00:43,720 --> 00:00:45,400
+elevation
+
+11
+00:00:45,400 --> 00:00:49,800
+So you want that to kind of remain the same so that's why I broke it apart
+
+12
+00:00:50,600 --> 00:00:52,600
+so to modify
+
+13
+00:00:52,960 --> 00:00:54,960
+This
+
+14
+00:00:55,000 --> 00:00:59,480
+Mesh here, there's a couple ways to do it one
+
+15
+00:01:00,800 --> 00:01:02,800
+Would be to go into edit mode
+
+16
+00:01:04,560 --> 00:01:07,320
+Kind of zoom into the area you want to modify and
+
+17
+00:01:09,960 --> 00:01:15,360
+Click on this it's called proportional editing and
+
+18
+00:01:16,360 --> 00:01:24,280
+And we'll pick the smooth approach and let's start with a small radius first, let's go three and see what happens
+
+19
+00:01:25,039 --> 00:01:26,440
+I'm actually
+
+20
+00:01:26,440 --> 00:01:28,440
+Gonna do just a point
+
+21
+00:01:28,640 --> 00:01:32,400
+And I'm gonna just move this point up and see what happens so
+
+22
+00:01:33,600 --> 00:01:35,600
+Not much difference. Let's increase
+
+23
+00:01:36,160 --> 00:01:38,160
+This to ten instead
+
+24
+00:01:39,880 --> 00:01:41,720
+So now you can see
+
+25
+00:01:41,720 --> 00:01:46,120
+With the proportional editing that when you move a vertice vertice
+
+26
+00:01:47,280 --> 00:01:49,280
+others in that
+
+27
+00:01:50,240 --> 00:01:52,200
+Radius move with it
+
+28
+00:01:52,200 --> 00:01:55,640
+So I'm just gonna turn off snap just to make it a little smoother
+
+29
+00:01:55,640 --> 00:01:59,340
+And so this is a kind of a look and feel type of thing
+
+30
+00:02:01,240 --> 00:02:06,300
+You can adjust that radius to the point where it makes sense to you
+
+31
+00:02:07,840 --> 00:02:11,079
+But yeah, this is ultimately you would go through
+
+32
+00:02:11,840 --> 00:02:14,320
+And just adjust the topography
+
+33
+00:02:15,020 --> 00:02:17,020
+relative to the house
+
+34
+00:02:22,960 --> 00:02:26,560
+So obviously we're going down here we'll probably want
+
+35
+00:02:29,079 --> 00:02:36,800
+Maybe a swale through here so the water doesn't run back into the house you can drop the whole thing
+
+36
+00:02:37,040 --> 00:02:38,800
+Or bring this up
+
+37
+00:02:44,960 --> 00:02:51,280
+So yeah, it's a matter of then yeah tweaking that those individual vertices
+
+38
+00:02:53,120 --> 00:02:56,480
+The other way well, let me just tab out of this thing here
+
+39
+00:02:56,480 --> 00:02:59,200
+So just after it tabs out of into object mode I
+
+40
+00:03:00,160 --> 00:03:06,040
+Think it saves it to the IFC but with these large meshes. I just want to make sure to
+
+41
+00:03:08,359 --> 00:03:10,359
+Save the representation manually
+
+42
+00:03:11,160 --> 00:03:13,160
+And then I'm gonna go to the other side
+
+43
+00:03:14,280 --> 00:03:16,280
+And I'm gonna go to the other side
+
+44
+00:03:17,000 --> 00:03:19,000
+And I'm gonna go to the other side
+
+45
+00:03:20,000 --> 00:03:22,000
+And I'm gonna go to the other side
+
+46
+00:03:22,000 --> 00:03:24,000
+To
+
+47
+00:03:24,380 --> 00:03:26,380
+Save the representation manually
+
+48
+00:03:26,920 --> 00:03:29,560
+So if you want to just do this just to be make sure
+
+49
+00:03:30,520 --> 00:03:36,000
+You can run tests to see if it actually does save but this other method. I'm going to show you
+
+50
+00:03:37,120 --> 00:03:41,560
+You definitely have to manually save representation after you save it
+
+51
+00:03:44,540 --> 00:03:46,800
+So there it's saved the other
+
+52
+00:03:48,400 --> 00:03:50,340
+Method is
+
+53
+00:03:50,340 --> 00:03:53,700
+is to use the sculpting mode.
+
+54
+00:03:53,700 --> 00:04:00,660
+So before you go into that mode, you want to be in edit mode
+
+55
+00:04:00,660 --> 00:04:05,300
+and have the mesh selected that you want to modify and go
+
+56
+00:04:05,300 --> 00:04:06,060
+into sculpting.
+
+57
+00:04:13,100 --> 00:04:15,480
+Then zoom in.
+
+58
+00:04:15,480 --> 00:04:19,920
+So here's a bunch of tools to modify
+
+59
+00:04:19,920 --> 00:04:22,079
+mesh or surface geometry.
+
+60
+00:04:22,079 --> 00:04:26,520
+I just like to use the first one.
+
+61
+00:04:26,520 --> 00:04:32,200
+And you can see here, if you just press down on it,
+
+62
+00:04:32,200 --> 00:04:35,520
+you can see that it's actually lifting up the surface.
+
+63
+00:04:35,520 --> 00:04:39,120
+If you click on the minus, you can see it's pushing down.
+
+64
+00:04:39,120 --> 00:04:44,960
+The strength, obviously, has more impact on the mesh.
+
+65
+00:04:44,960 --> 00:04:51,520
+And then the radius, you can see it affects the circle there.
+
+66
+00:04:51,520 --> 00:04:55,240
+So it's just the area that you're modifying.
+
+67
+00:04:55,240 --> 00:04:59,040
+So I'm sure these other tools will allow you to modify as
+
+68
+00:04:59,040 --> 00:05:03,240
+well, but I find just this first tool is fine.
+
+69
+00:05:03,240 --> 00:05:06,560
+And so again, after doing that, you
+
+70
+00:05:06,560 --> 00:05:09,320
+want to manually save representation.
+
diff --git a/136000_20250711_1223 - Adding Entourage/136000_20250711_1223 - Adding Entourage.srt b/136000_20250711_1223 - Adding Entourage/136000_20250711_1223 - Adding Entourage.srt
new file mode 100644
index 0000000..c5e31f0
--- /dev/null
+++ b/136000_20250711_1223 - Adding Entourage/136000_20250711_1223 - Adding Entourage.srt
@@ -0,0 +1,324 @@
+1
+00:00:00,000 --> 00:00:08,080
+All right, so now the fun part adding entourage to our model I started this entourage repo here and pulled
+
+2
+00:00:08,480 --> 00:00:10,480
+various entourage
+
+3
+00:00:10,800 --> 00:00:12,800
+Assets from
+
+4
+00:00:13,320 --> 00:00:16,640
+Various locations on the internet that are all open source and
+
+5
+00:00:18,600 --> 00:00:20,600
+Then I
+
+6
+00:00:20,800 --> 00:00:22,800
+synced it into our
+
+7
+00:00:23,200 --> 00:00:28,320
+Project repo as a sub module, you know similar to the OD textures and whatnot
+
+8
+00:00:28,800 --> 00:00:30,800
+So if we go into that folder
+
+9
+00:00:31,360 --> 00:00:33,860
+You'll see the various entourages. I'll just
+
+10
+00:00:34,860 --> 00:00:36,860
+Go into one
+
+11
+00:00:36,900 --> 00:00:38,900
+Actually, I'll go under the people here
+
+12
+00:00:40,800 --> 00:00:42,800
+Go into this one here
+
+13
+00:00:43,520 --> 00:00:48,580
+So you'll see it's a there's a blend file. There's a jlb
+
+14
+00:00:49,240 --> 00:00:55,400
+File and then usually the link to where the asset was taken and then the license there
+
+15
+00:00:55,400 --> 00:00:58,480
+So I've opened
+
+16
+00:01:01,960 --> 00:01:07,920
+That file that girl file here, okay, and so if I select it you'll see that
+
+17
+00:01:09,039 --> 00:01:13,360
+Has about eighty thousand facets, so that's pretty large
+
+18
+00:01:14,240 --> 00:01:18,759
+so if you did something like this where you you know copied and
+
+19
+00:01:19,840 --> 00:01:23,280
+Went to our file and then paste it
+
+20
+00:01:25,400 --> 00:01:27,400
+And then move it
+
+21
+00:01:29,160 --> 00:01:31,160
+It's here
+
+22
+00:01:31,840 --> 00:01:38,700
+If we did this in our file and then copied this just simple duplicate all over that would
+
+23
+00:01:39,320 --> 00:01:42,080
+Add to the size of the file immensely
+
+24
+00:01:43,520 --> 00:01:50,640
+So we don't necessarily want to do that we instead want to be a little clever and link in
+
+25
+00:01:52,280 --> 00:01:54,760
+That object instead so
+
+26
+00:01:55,400 --> 00:01:57,400
+to link in
+
+27
+00:01:58,200 --> 00:02:00,400
+You can go under link here
+
+28
+00:02:01,640 --> 00:02:06,360
+Then navigate to where our object is actually I'm just gonna
+
+29
+00:02:07,200 --> 00:02:11,160
+Pull out of that again. You can see going to people
+
+30
+00:02:13,640 --> 00:02:18,840
+Click double click on the blend file, and then I'm going with the object first and then the girl
+
+31
+00:02:19,520 --> 00:02:20,960
+so
+
+32
+00:02:20,960 --> 00:02:25,960
+That will link it in to the origin all the way over here, I'm going to zoom over
+
+33
+00:02:26,800 --> 00:02:33,720
+When we link in an object and we try to move it it does not move or try to scale it does not scale
+
+34
+00:02:35,000 --> 00:02:39,280
+we have to do another trick in order to
+
+35
+00:02:41,960 --> 00:02:43,960
+Do those procedures
+
+36
+00:02:44,400 --> 00:02:45,600
+so
+
+37
+00:02:45,600 --> 00:02:50,200
+we want to put that linked object in a
+
+38
+00:02:51,960 --> 00:02:53,600
+Collection and
+
+39
+00:02:53,600 --> 00:02:59,040
+Then place a collection in instance so first. I'm just gonna
+
+40
+00:02:59,880 --> 00:03:01,440
+right-click on
+
+41
+00:03:01,440 --> 00:03:04,760
+Move to collection, and I'm just gonna say girl
+
+42
+00:03:08,520 --> 00:03:11,320
+Okay now I'm going to place that instance
+
+43
+00:03:13,200 --> 00:03:15,440
+In world here
+
+44
+00:03:17,520 --> 00:03:19,520
+Let's see here
+
+45
+00:03:21,800 --> 00:03:25,720
+I think I gotta locate my cursor
+
+46
+00:03:28,440 --> 00:03:30,440
+Do that again
+
+47
+00:03:33,600 --> 00:03:35,480
+There we go
+
+48
+00:03:35,480 --> 00:03:37,480
+so now
+
+49
+00:03:37,720 --> 00:03:45,640
+Because it's a collection instance we can move it and we can scale it so that has its advantages obviously especially when it comes to
+
+50
+00:03:46,240 --> 00:03:48,240
+Vegetation where you want to scale it up and down
+
+51
+00:03:48,240 --> 00:03:50,240
+So
+
+52
+00:03:52,880 --> 00:04:00,140
+That being the case that you want collection instances instead of links what I like to do
+
+53
+00:04:01,960 --> 00:04:05,280
+Is I like to create a another file
+
+54
+00:04:07,160 --> 00:04:09,160
+Strictly for
+
+55
+00:04:09,200 --> 00:04:16,460
+Collection instances for entourage, so you'll see here. I have a bunch. I've already converted. I've linked in
+
+56
+00:04:18,600 --> 00:04:23,280
+These people from various other files, and then I created
+
+57
+00:04:24,040 --> 00:04:29,640
+Collection instances from them you can see if I turn on that collection. They're all
+
+58
+00:04:31,240 --> 00:04:36,880
+Located at zero there. They're all bunched up. That's kind of wild huh, so
+
+59
+00:04:38,760 --> 00:04:40,640
+Now I
+
+60
+00:04:40,640 --> 00:04:46,560
+Like to just take open this file concurrently from the project file, and then just copy
+
+61
+00:04:47,480 --> 00:04:49,480
+Just simply copy
+
+62
+00:04:50,720 --> 00:04:52,720
+And then
+
+63
+00:04:52,800 --> 00:04:54,800
+paste
+
+64
+00:04:56,240 --> 00:05:03,020
+In our file you can move it over so now I can scale this do whatever
+
+65
+00:05:04,560 --> 00:05:11,520
+This actually just brings in just a collection instance itself. It doesn't bring in the collection which is kind of nice
+
+66
+00:05:12,560 --> 00:05:14,560
+you don't have a
+
+67
+00:05:15,320 --> 00:05:18,200
+Duplication of both the collection and the collection instance
+
+68
+00:05:20,240 --> 00:05:23,600
+So in addition to being able to scale and move
+
+69
+00:05:25,920 --> 00:05:32,540
+Collection instances that have links in them the other advantage is that it doesn't add to your file size
+
+70
+00:05:33,680 --> 00:05:36,840
+So you can keep your file size very low because everything is outside
+
+71
+00:05:40,000 --> 00:05:43,700
+In that same vein there's one approach
+
+72
+00:05:44,680 --> 00:05:47,680
+that blender offers where if I click on the
+
+73
+00:05:48,520 --> 00:05:50,520
+the linked
+
+74
+00:05:50,760 --> 00:05:57,000
+Object that doesn't move or doesn't scale and I go to this chain here and
+
+75
+00:05:57,920 --> 00:06:02,280
+I right click and go to library override and then select it
+
+76
+00:06:03,080 --> 00:06:07,500
+It allows me now to scale that link and move it
+
+77
+00:06:08,840 --> 00:06:13,800
+The reason I don't use this approach though is that it does add to the file size
+
+78
+00:06:15,120 --> 00:06:21,540
+It's not as much as just pulling a pending or copy pasting the asset in the file
+
+79
+00:06:21,680 --> 00:06:26,240
+But it does add to the file pretty considerably, so I just don't do that
+
+80
+00:06:26,800 --> 00:06:29,640
+at all I just take the approach where I
+
+81
+00:06:31,840 --> 00:06:35,300
+Bring in collection instances that have links in them
+
diff --git a/137000_20250909_1001 - Creating a new drawing pattern/137000_20250909_1001 - Creating a new drawing pattern.srt b/137000_20250909_1001 - Creating a new drawing pattern/137000_20250909_1001 - Creating a new drawing pattern.srt
new file mode 100644
index 0000000..1c8df87
--- /dev/null
+++ b/137000_20250909_1001 - Creating a new drawing pattern/137000_20250909_1001 - Creating a new drawing pattern.srt
@@ -0,0 +1,288 @@
+1
+00:00:00,000 --> 00:00:06,940
+So, Shahruul on the OSARCH website asked if we can create a unique pattern like this gravel
+
+2
+00:00:06,940 --> 00:00:09,100
+pattern here in Bonsai.
+
+3
+00:00:09,100 --> 00:00:10,400
+And yes you can.
+
+4
+00:00:10,400 --> 00:00:16,880
+So he created this seed file, this gravel pattern, which I opened in Inkscape here.
+
+5
+00:00:16,880 --> 00:00:19,200
+See it's just vector based.
+
+6
+00:00:19,200 --> 00:00:23,600
+Then I opened up our patterns SVG file here.
+
+7
+00:00:23,600 --> 00:00:28,080
+And again to remind you where that's located, it's at that path there.
+
+8
+00:00:28,080 --> 00:00:29,080
+It's called patterns SVG.
+
+9
+00:00:29,159 --> 00:00:33,160
+These are all our drawing assets.
+
+10
+00:00:33,160 --> 00:00:42,920
+So just copy the vector lines there and paste it in our patterns file.
+
+11
+00:00:42,920 --> 00:00:44,280
+And I'm going to group it.
+
+12
+00:00:44,280 --> 00:00:46,280
+Right click and group.
+
+13
+00:00:46,280 --> 00:00:49,760
+And I'm going to scale it down.
+
+14
+00:00:49,760 --> 00:00:53,560
+Control to hold the aspect ratio.
+
+15
+00:00:53,560 --> 00:00:57,560
+Delete that.
+
+16
+00:00:57,560 --> 00:00:59,560
+Previous.
+
+17
+00:00:59,560 --> 00:01:04,560
+And scale it down.
+
+18
+00:01:04,560 --> 00:01:14,240
+And we want to select it and go up to pattern and objects to pattern.
+
+19
+00:01:14,240 --> 00:01:19,520
+If we go to our XML editor you'll see that it creates that new pattern under the def
+
+20
+00:01:19,520 --> 00:01:21,860
+tag here.
+
+21
+00:01:21,860 --> 00:01:25,820
+And just names it random pattern 11.
+
+22
+00:01:25,820 --> 00:01:32,300
+Which we will change to gravel 2.
+
+23
+00:01:32,300 --> 00:01:36,300
+You'll notice that most of these patterns are not under the def tag.
+
+24
+00:01:36,300 --> 00:01:44,900
+I think the way an SVG should be organized, all the patterns should be in the def tag.
+
+25
+00:01:44,900 --> 00:01:50,340
+We'll keep it there for now but it doesn't necessarily have to be.
+
+26
+00:01:50,340 --> 00:01:52,900
+So save the file.
+
+27
+00:01:52,900 --> 00:01:55,420
+Go back to our bonsai.
+
+28
+00:01:55,420 --> 00:01:59,420
+And I've created a section here at the retaining wall.
+
+29
+00:01:59,420 --> 00:02:02,660
+And I just run the drawing.
+
+30
+00:02:02,660 --> 00:02:05,420
+Take note that the fill mode is turned shapely.
+
+31
+00:02:05,420 --> 00:02:09,340
+And I'm just going to run the drawing.
+
+32
+00:02:09,340 --> 00:02:13,060
+See what we're dealing with.
+
+33
+00:02:13,060 --> 00:02:15,040
+So we'll right click on Chrome.
+
+34
+00:02:15,040 --> 00:02:17,880
+Go to inspect to see what the rule is.
+
+35
+00:02:17,880 --> 00:02:19,400
+Assigned to this.
+
+36
+00:02:19,400 --> 00:02:20,400
+This rule.
+
+37
+00:02:20,400 --> 00:02:22,600
+I'm going to copy that.
+
+38
+00:02:22,600 --> 00:02:29,640
+I'm going to go to our default CSS that I have open in a text editor here.
+
+39
+00:02:29,640 --> 00:02:32,280
+And just search for it.
+
+40
+00:02:32,280 --> 00:02:33,280
+There's the rule.
+
+41
+00:02:33,280 --> 00:02:38,799
+I'm going to copy and I'm just going to paste it to seed our gravel pattern.
+
+42
+00:02:38,800 --> 00:02:45,320
+I'm going to change that to gravel2.
+
+43
+00:02:45,320 --> 00:02:50,980
+And then I'm going to change this to gravel2.
+
+44
+00:02:50,980 --> 00:02:55,520
+So anything in this URL is basically looking in the patterns file for a pattern with an
+
+45
+00:02:55,520 --> 00:02:57,400
+ID of this name.
+
+46
+00:02:57,400 --> 00:02:59,280
+So we already did that.
+
+47
+00:02:59,280 --> 00:03:08,760
+So I'm going to save.
+
+48
+00:03:08,760 --> 00:03:12,880
+And then I'm going to go back to our bones eye file.
+
+49
+00:03:12,880 --> 00:03:15,840
+And select the object here.
+
+50
+00:03:15,840 --> 00:03:20,120
+And we're going to go to our materials and we're going to change the layer set name to
+
+51
+00:03:20,120 --> 00:03:22,120
+gravel2.
+
+52
+00:03:22,120 --> 00:03:30,079
+And then I'm going to run the drawing again.
+
+53
+00:03:30,079 --> 00:03:32,000
+There's our gravel pattern.
+
+54
+00:03:32,000 --> 00:03:36,600
+So if you want to later on change the scale of that pattern.
+
+55
+00:03:36,600 --> 00:03:40,440
+Let's say it's too big.
+
+56
+00:03:40,440 --> 00:03:43,120
+Patterns file here.
+
+57
+00:03:43,120 --> 00:03:55,800
+And we want to pull out this, the G, the group of that pattern there.
+
+58
+00:03:55,800 --> 00:04:00,120
+Out to the bottom here.
+
+59
+00:04:00,120 --> 00:04:04,080
+In order to see it in the viewport here.
+
+60
+00:04:04,080 --> 00:04:11,400
+And so let's just scale it down.
+
+61
+00:04:11,400 --> 00:04:14,000
+And let's take note of these dimensions here.
+
+62
+00:04:14,000 --> 00:04:16,959
+Let's actually just change it to 10.
+
+63
+00:04:16,959 --> 00:04:18,780
+And 10.
+
+64
+00:04:18,780 --> 00:04:22,320
+Scale it down to that to make it easy.
+
+65
+00:04:22,320 --> 00:04:29,880
+Alright and after that change we want to drag it back then now into our patterns tag.
+
+66
+00:04:30,520 --> 00:04:41,360
+And that 10 by 10 you want to reflect in the patterns tag here as well.
+
+67
+00:04:41,360 --> 00:04:46,400
+So 10 and then 10.
+
+68
+00:04:46,400 --> 00:04:52,040
+And then you want to save.
+
+69
+00:04:52,040 --> 00:04:55,700
+Then go back to bones eye and then rerun the drawing.
+
+70
+00:04:55,700 --> 00:04:56,700
+And see what happens.
+
+71
+00:04:57,700 --> 00:04:58,700
+And there it is.
+
+72
+00:04:58,700 --> 00:04:59,420
+A smaller scale.
+
diff --git a/transcriber/.dockerignore b/transcriber/.dockerignore
new file mode 100644
index 0000000..0300dec
--- /dev/null
+++ b/transcriber/.dockerignore
@@ -0,0 +1 @@
+**/.venv
diff --git a/transcriber/.github/actions/setup-python-env/action.yml b/transcriber/.github/actions/setup-python-env/action.yml
new file mode 100644
index 0000000..7e8f6b3
--- /dev/null
+++ b/transcriber/.github/actions/setup-python-env/action.yml
@@ -0,0 +1,30 @@
+name: "Setup Python Environment"
+description: "Set up Python environment for the given Python version"
+
+inputs:
+ python-version:
+ description: "Python version to use"
+ required: true
+ default: "3.12"
+ uv-version:
+ description: "uv version to use"
+ required: true
+ default: "0.6.14"
+
+runs:
+ using: "composite"
+ steps:
+ - uses: actions/setup-python@v5
+ with:
+ python-version: ${{ inputs.python-version }}
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ version: ${{ inputs.uv-version }}
+ enable-cache: 'true'
+ cache-suffix: ${{ matrix.python-version }}
+
+ - name: Install Python dependencies
+ run: uv sync --frozen
+ shell: bash
diff --git a/transcriber/.github/workflows/main.yml b/transcriber/.github/workflows/main.yml
new file mode 100644
index 0000000..7b79388
--- /dev/null
+++ b/transcriber/.github/workflows/main.yml
@@ -0,0 +1,123 @@
+name: Main
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ types: [opened, synchronize, reopened, ready_for_review]
+
+jobs:
+ quality:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - uses: actions/cache@v4
+ with:
+ path: ~/.cache/pre-commit
+ key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
+
+ - name: Set up the environment
+ uses: ./.github/actions/setup-python-env
+
+ - name: Run checks
+ run: make check
+
+ tests-and-type-check:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: ["3.9", "3.10", "3.11", "3.12"]
+ fail-fast: false
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - name: Set up the environment
+ uses: ./.github/actions/setup-python-env
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Run tests
+ # Your 'make test' target: @uv run python -m pytest --cov --cov-config=pyproject.toml -vv
+ # Your pyproject.toml already defines all cov-reports (term-missing, json, lcov, xml, html).
+ # So, 'make test' *will* generate htmlcov/ and coverage.xml.
+ run: make test
+
+ - name: Upload coverage artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: coverage-report-${{ matrix.python-version }}
+ path: |
+ htmlcov/
+ coverage.xml
+
+ - name: Check typing
+ run: uv run mypy
+
+
+ # - name: Upload coverage reports to Codecov with GitHub Action on Python 3.11
+ # uses: codecov/codecov-action@v4
+ # if: ${{ matrix.python-version == '3.11' }}
+ # env:
+ # CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+
+ check-docs:
+ runs-on: ubuntu-latest
+ needs: tests-and-type-check
+
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - name: Set up the environment
+ uses: ./.github/actions/setup-python-env
+
+ - name: Download coverage artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: coverage-report-3.12
+ path: . # Downloads htmlcov/ and coverage.xml to the root of the runner
+
+ - name: List downloaded files
+ run: |
+ ls -F
+ ls -F htmlcov/ # Check inside the downloaded htmlcov directory
+
+ - name: Check if documentation can be built
+ run: make docs-test
+
+ deploy-docs:
+ runs-on: ubuntu-latest
+ # This job should only run after 'check-docs' is successful
+ needs: check-docs
+ # Only deploy on pushes to the 'main' branch
+ if: github.ref == 'refs/heads/main' && success() # 'success()' ensures it only runs if 'needs' jobs succeeded
+ permissions:
+ contents: write # Grant write permission to the GITHUB_TOKEN for this job
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+ # Need to fetch history for actions-gh-pages if it's operating on specific branches
+ with:
+ fetch-depth: 0
+
+ - name: Set up the environment
+ uses: ./.github/actions/setup-python-env
+
+ # To deploy, we first need to build the actual documentation site files
+ - name: Build documentation site
+ run: uv run mkdocs build # This generates the 'site/' directory by default
+
+ - name: Deploy to GitHub Pages
+ uses: peaceiris/actions-gh-pages@v4
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./site
+ publish_branch: gh-pages
+ commit_message: 'Deploy transcriber docs to GitHub Pages'
diff --git a/transcriber/.github/workflows/on-release-main.yml b/transcriber/.github/workflows/on-release-main.yml
new file mode 100644
index 0000000..fec7fbb
--- /dev/null
+++ b/transcriber/.github/workflows/on-release-main.yml
@@ -0,0 +1,66 @@
+name: release-main
+
+on:
+ release:
+ types: [published]
+
+jobs:
+
+ set-version:
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Export tag
+ id: vars
+ run: echo tag=${GITHUB_REF#refs/*/} >> $GITHUB_OUTPUT
+ if: ${{ github.event_name == 'release' }}
+
+ - name: Update project version
+ run: |
+ sed -i "s/^version = \".*\"/version = \"$RELEASE_VERSION\"/" pyproject.toml
+ env:
+ RELEASE_VERSION: ${{ steps.vars.outputs.tag }}
+ if: ${{ github.event_name == 'release' }}
+
+ - name: Upload updated pyproject.toml
+ uses: actions/upload-artifact@v4
+ with:
+ name: pyproject-toml
+ path: pyproject.toml
+
+ publish:
+ runs-on: ubuntu-latest
+ needs: [set-version]
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - name: Set up the environment
+ uses: ./.github/actions/setup-python-env
+
+ - name: Download updated pyproject.toml
+ uses: actions/download-artifact@v4
+ with:
+ name: pyproject-toml
+
+ - name: Build package
+ run: uv build
+
+ - name: Publish package
+ run: uv publish
+ env:
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
+
+ deploy-docs:
+ needs: publish
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+
+ - name: Set up the environment
+ uses: ./.github/actions/setup-python-env
+
+ - name: Deploy documentation
+ run: uv run mkdocs gh-deploy --force
diff --git a/transcriber/.gitignore b/transcriber/.gitignore
new file mode 100644
index 0000000..3311e1c
--- /dev/null
+++ b/transcriber/.gitignore
@@ -0,0 +1,211 @@
+docs/source
+
+# From https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[codz]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py.cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# UV
+# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+#uv.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+#poetry.toml
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
+# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
+#pdm.lock
+#pdm.toml
+.pdm-python
+.pdm-build/
+
+# pixi
+# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
+#pixi.lock
+# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
+# in the .venv directory. It is recommended not to include this directory in version control.
+.pixi
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.envrc
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Abstra
+# Abstra is an AI-powered process automation framework.
+# Ignore directories containing user credentials, local state, and settings.
+# Learn more at https://abstra.io/docs
+.abstra/
+
+# Visual Studio Code
+# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
+# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
+# and can be added to the global gitignore or merged into this file. However, if you prefer,
+# you could uncomment the following to ignore the entire vscode folder
+# .vscode/
+
+# Ruff stuff:
+.ruff_cache/
+
+# PyPI configuration file
+.pypirc
+
+# Cursor
+# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
+# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
+# refer to https://docs.cursor.com/context/ignore-files
+.cursorignore
+.cursorindexingignore
+
+# Marimo
+marimo/_static/
+marimo/_lsp/
+__marimo__/
diff --git a/transcriber/.pre-commit-config.yaml b/transcriber/.pre-commit-config.yaml
new file mode 100644
index 0000000..30d6818
--- /dev/null
+++ b/transcriber/.pre-commit-config.yaml
@@ -0,0 +1,32 @@
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: "v5.0.0"
+ hooks:
+ - id: check-case-conflict
+ files: ^(transcriber/(src|tests)/.*|transcriber/[^/]*)$
+ - id: check-merge-conflict
+ files: ^(transcriber/(src|tests)/.*|transcriber/[^/]*)$
+ - id: check-toml
+ files: ^(transcriber/(src|tests)/.*\.toml|transcriber/[^/]*\.toml)$
+ - id: check-yaml
+ files: ^(transcriber/(src|tests)/.*\.(yml|yaml)|transcriber/[^/]*\.(yml|yaml))$
+ - id: check-json
+ files: ^(transcriber/(src|tests)/.*\.json|transcriber/[^/]*\.json)$
+ exclude: ^(transcriber/.devcontainer/devcontainer.json)$
+ - id: pretty-format-json
+ files: ^(transcriber/(src|tests)/.*\.json|transcriber/[^/]*\.json)$
+ exclude: ^(transcriber/.devcontainer/devcontainer.json)$
+ args: [--autofix, --no-sort-keys]
+ - id: end-of-file-fixer
+ files: ^(transcriber/(src|tests)/.*|transcriber/[^/]*)$
+ - id: trailing-whitespace
+ files: ^(transcriber/(src|tests)/.*|transcriber/[^/]*)$
+
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: "v0.12.7"
+ hooks:
+ - id: ruff-check
+ files: ^(transcriber/(src|tests)/.*\.py|transcriber/[^/]*\.py)$
+ args: [ --exit-non-zero-on-fix ]
+ - id: ruff-format
+ files: ^(transcriber/(src|tests)/.*\.py|transcriber/[^/]*\.py)$
diff --git a/transcriber/.python-version b/transcriber/.python-version
new file mode 100644
index 0000000..2d4715b
--- /dev/null
+++ b/transcriber/.python-version
@@ -0,0 +1 @@
+3.11.11
diff --git a/transcriber/Dockerfile b/transcriber/Dockerfile
new file mode 100644
index 0000000..d796a54
--- /dev/null
+++ b/transcriber/Dockerfile
@@ -0,0 +1,67 @@
+# 1. Base Image
+# Start with the lean Python image we prefer.
+FROM python:3.11-slim
+
+# 2. Install uv and set up Working Directory/Environment
+# Set up the working directory.
+WORKDIR /app
+
+
+# Install uv utility from its container image.
+COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
+
+# Set the cache directory to a writable location before dependencies are installed.
+ENV XDG_CACHE_HOME=/app/whisper_cache
+
+# 3. Install OS Dependencies
+# Combine apt-get steps to leverage caching and minimize image size.
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends ffmpeg \
+ && rm -rf /var/lib/apt/lists/* && \
+ mkdir -p ${XDG_CACHE_HOME} && \
+ chmod -R a+w ${XDG_CACHE_HOME}
+
+# 4. Install Python Dependencies
+# Only copy files necessary for dependency resolution (best for caching).
+COPY README.md .
+COPY uv.lock .
+COPY pyproject.toml .
+
+# This guarantees the path /app/.venv/bin/python will exist.
+RUN uv sync --no-dev --frozen
+
+# 5. Copy Application Code
+# Changes to source code here won't invalidate the slow dependency layer above.
+COPY src src
+
+# 6. Final Command
+CMD [ "/app/.venv/bin/python", "src/transcriber/transcribe.py" ]
+
+# # Install uv
+# FROM python:3.11-slim
+# COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
+
+# # Change the working directory to the `app` directory
+# WORKDIR /app
+
+# # Copy the lockfile and `pyproject.toml` into the image
+# COPY README.md .
+# COPY uv.lock /app/uv.lock
+# COPY pyproject.toml /app/pyproject.toml
+
+# # Install OS updates and dependencies
+# RUN apt-get update && apt-get install -y ffmpeg
+
+# # Install our python requirements.
+# RUN uv sync --no-dev --frozen
+# # uv sync --no-deps --frozen --no-install-project
+
+# COPY src src
+
+# # Sync the project
+# # RUN uv sync --frozen
+
+# # Set the cache directory to a writable location within the app directory
+# ENV XDG_CACHE_HOME=/app/whisper_cache
+
+# CMD [ "/app/.venv/binpython", "src/transcriber/transcribe.py" ]
diff --git a/transcriber/LICENSE b/transcriber/LICENSE
new file mode 100644
index 0000000..3886a83
--- /dev/null
+++ b/transcriber/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Doug Scoular
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/transcriber/Makefile b/transcriber/Makefile
new file mode 100644
index 0000000..19627fa
--- /dev/null
+++ b/transcriber/Makefile
@@ -0,0 +1,122 @@
+.PHONY: check-versions
+check-versions: ## Check for outdated package versions (including major bumps)
+ @echo "🚀 Checking for outdated package versions"
+ @uv run pip-review | grep -v 'transcriber==' || true
+
+.PHONY: update
+update: ## Update all project dependencies to the latest compatible versions and refresh the lock file.
+ @echo "🔒 Resolving and freezing latest compatible versions in uv.lock..."
+ @uv lock # This does the update to the latest versions
+
+ @echo "🚀 Installing new versions into virtual environment..."
+ @uv sync # This installs the new versions from uv.lock
+
+.PHONY: install
+install: ## Install the virtual environment and install the pre-commit hooks
+ @echo "🚀 Creating virtual environment using uv"
+ @uv sync
+ @uv run pre-commit install
+
+.PHONY: check
+check: ## Run code quality tools.
+ @echo "🚀 Checking lock file consistency with 'pyproject.toml'"
+ @uv lock --locked
+ @echo "🚀 Linting code: Running pre-commit"
+ @uv run pre-commit run -a
+ @echo "🚀 Static type checking: Running mypy"
+ @uv run mypy
+ @echo "🚀 Checking for obsolete dependencies: Running deptry"
+ @uv run deptry src tests
+
+.PHONY: test
+test: ## Test the code with pytest -vv gives us pytest-smart output.
+ @echo "🚀 Testing code: Running pytest"
+ @uv run python -m pytest tests/ --cov --cov-config=pyproject.toml -vv
+
+.PHONY: clean-build
+clean-build: ## Clean build artifacts
+ @echo "🚀 Removing build artifacts"
+ @uv run python -c "import shutil; import os; shutil.rmtree('dist') if os.path.exists('dist') else None"
+
+.PHONY: build
+build: clean-build ## Build wheel file
+ @echo "🚀 Creating wheel file"
+ @uvx --from build pyproject-build --installer uv
+
+.PHONY: docs-test
+docs-test: ## Test if documentation can be built without warnings or errors
+ @uv run mkdocs build -s
+
+.PHONY: docs
+docs: ## Build and serve the documentation
+ @./.venv/bin/mkdocs serve --dev-addr 127.0.0.1:8000 --watch docs --watch src/transcriber
+
+.PHONY: man
+man: ## Show what passes for a manual page in python
+ @uv run python src/transcriber/transcribe.py --help
+
+# Determine the parent directory of the Makefile.
+BONSAI_TUTORIALS_ROOT ?= $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..)
+
+.PHONY: transcribe
+transcribe: ## Transcribe video files to SRT subtitle files interactively
+ @uv run python src/transcriber/transcribe.py --input-path $(BONSAI_TUTORIALS_ROOT) --interactive --exclude \
+ "_Model/sheets/jpgs/output.mp4" \
+ "_Model/OD_Textures/Open Source/AmbientCG/space-generation-success.mp4" \
+ "_Model/OD_Textures/Open Source/AmbientCG/space-generation-fail.mp4" \
+ "_Model/Animation/final video.mp4"
+
+# Define a variable for your Docker image name/tag
+DOCKER_IMAGE_NAME := transcriber-app:latest
+
+# Define dependencies that will trigger a Docker build
+DOCKER_DEPENDENCIES := Dockerfile pyproject.toml uv.lock src/transcriber
+
+# Touch this file after the docker build
+DOCKER_BUILD_TRIGGER := .docker-build-timestamp
+
+INPUT_DIR_HOST ?= $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..)
+
+.PHONY: docker-build
+docker-build: $(DOCKER_DEPENDENCIES)
+ @echo "🚀 Building Docker image $(DOCKER_IMAGE_NAME)"
+ @docker build -t $(DOCKER_IMAGE_NAME) .
+ @touch $(DOCKER_BUILD_TRIGGER)
+
+.PHONY: docker-run
+# Default target to run the transcriber script in a Docker container (interactive mode)
+docker-run: docker-run-interactive
+
+.PHONY: docker-run-non-interactive
+docker-run-non-interactive: docker-build ## Run the transcriber script in a Docker container (non-interactive by default)
+ @echo "🚀 Running transcriber in Docker (non-interactive)"
+ # This target allows specifying INPUT_DIR_HOST=/path/to/your/videos
+ # If INPUT_DIR_HOST is NOT set, the script will use its default input path (which is /app inside the container).
+ # This is suitable if the user's videos are placed within the project's mounted /app directory.
+
+ # Construct the docker run command
+ @chmod +x helpers/docker-run.sh # Ensure the script is executable.
+ @./helpers/docker-run.sh \
+ "$(INPUT_DIR_HOST)" \
+ "--exclude \"_Model/sheets/jpgs/output.mp4\" \"_Model/OD_Textures/Open Source/AmbientCG/space-generation-success.mp4\" \"_Model/OD_Textures/Open Source/AmbientCG/space-generation-fail.mp4\" \"_Model/Animation/final video.mp4\" $(ARGS)" \
+ "$(DOCKER_IMAGE_NAME)"
+
+.PHONY: docker-run-interactive
+docker-run-interactive: docker-build ## Run the transcriber script in a Docker container (interactive mode)
+ @chmod +x helpers/docker-run.sh # Ensure the script is executable.
+ @./helpers/docker-run.sh \
+ "$(INPUT_DIR_HOST)" \
+ "--interactive --exclude \"_Model/sheets/jpgs/output.mp4\" \"_Model/OD_Textures/Open Source/AmbientCG/space-generation-success.mp4\" \"_Model/OD_Textures/Open Source/AmbientCG/space-generation-fail.mp4\" \"_Model/Animation/final video.mp4\" $(ARGS)" \
+ "$(DOCKER_IMAGE_NAME)"
+
+.PHONY: docker-clean
+docker-clean: ## Remove the transcriber Docker image
+ @echo "🚀 Cleaning Docker image $(DOCKER_IMAGE_NAME)"
+ docker rmi $(DOCKER_IMAGE_NAME) || true
+
+.PHONY: help
+help:
+ @uv run python -c "import re; \
+ [[print(f'\033[36m{m[0]:<20}\033[0m {m[1]}') for m in re.findall(r'^([a-zA-Z_-]+):.*?## (.*)$$', open(makefile).read(), re.M)] for makefile in ('$(MAKEFILE_LIST)').strip().split()]"
+
+.DEFAULT_GOAL := help
diff --git a/transcriber/README.md b/transcriber/README.md
new file mode 100644
index 0000000..7ef7bbc
--- /dev/null
+++ b/transcriber/README.md
@@ -0,0 +1,38 @@
+# transcriber
+
+[](https://img.shields.io/github/v/release/dscoular/transcriber)
+[](https://github.com/dscoular/transcriber/actions/workflows/main.yml?query=branch%3Amain)
+[](https://img.shields.io/github/commit-activity/m/dscoular/transcriber)
+[](https://img.shields.io/github/license/dscoular/transcriber)
+
+A python script which uses whisper to transcribe videos and outputs SRT subtitle text files.
+
+- **Github repository**:
+- **Documentation**
+
+# `UV` or `Docker` - that is the question.
+
+Whether you choose to use `uv` or `docker` our `Makefile` will launch it to a series of interactive
+questions with sensible defaults. It will use the second smallest language model `base.en` by
+default, however I used the largest model `medium.en` for the SRT files I've commited to this repo.
+To be honest there wasn't much difference that I could discern.
+
+## Using python's `uv`
+
+If you have `uv` in your `PATH` and `ffmpeg` installed in your operating system, you should
+be able to do the following to install and use this package.
+
+1. `make` - runs the default target of `make help` to show help on all the `make` targets.
+2. `make install` - installs the virtual environment and pre-commit hooks.
+3. `make check` - **optional**, runs the code quality tools.
+4. `make test` - **optional**, runs unit tests.
+5. `make docs-test` - **optional**, generate HTML documents in the `site` directory.
+6. `make transcribe` - by default, this converts the videos in the directory above our `Makefile` to `.srt` subtitle text files.
+
+## Using `Docker`
+
+If you have `docker` installed on your system, you should
+be able to do the following to install and use this package.
+
+1. `make docker-build` - Download and build the `transcribe-app` container image.
+2. `make docker-run` - Run the transcriber interactively, by default, this converts the videos in the directory above our `Makefile` to `.srt` subtitle text files.
diff --git a/transcriber/docs/docker.md b/transcriber/docs/docker.md
new file mode 100644
index 0000000..67d0681
--- /dev/null
+++ b/transcriber/docs/docker.md
@@ -0,0 +1,22 @@
+-----
+
+*Work in Progress*
+
+# Using Docker to Run Transcribe
+
+The beauty of using **`docker`** to run our **`transcribe`** script is that it handles
+all the dependencies for you.
+
+All you need is to have **`docker`** installed on your system and the **`Dockerfile`** found at
+the top-level of this repository.
+
+You can then do the following to transcribe your video files to SRT subtitle text files:
+
+```bash
+$ cd ~/projects/transcribe # Change directory to the directory which contains the Dockerfile.
+$ docker run -v ~/projects/Bonsai_Tutorials:/tutorials
+```
+
+*Work in Progress*
+
+-----
diff --git a/transcriber/docs/getting-started.md b/transcriber/docs/getting-started.md
new file mode 100644
index 0000000..694a820
--- /dev/null
+++ b/transcriber/docs/getting-started.md
@@ -0,0 +1,293 @@
+## Getting Started
+
+This project uses **`uv`** for dependency management and **`pyenv`** to ensure you're using the correct Python version. Follow the steps below for your operating system to quickly set up the environment and start developing.
+
+---
+
+### 1. Install System Prerequisites
+
+First, you need to install **`direnv`**, **`pyenv`**, **`uv`**, and **`ffmpeg`**.
+
+#### 🍎 **macOS**
+
+On MacOS, the easiest way to install these tools is using **Homebrew**. If you don't have Homebrew, install it first by following the instructions on the [Homebrew website](https://brew.sh/).
+
+```bash
+# Install direnv for managing per directory environment variables
+$ brew install direnv
+
+# Install pyenv for managing Python versions
+$ brew install pyenv
+
+# Install uv (the package manager)
+$ brew install uv
+
+# Install FFmpeg for audio/video processing
+$ brew install ffmpeg
+```
+
+**Note:** You must complete the **`pyenv`** shell configuration steps printed after installation (e.g., adding `eval "$(pyenv init -)"` to your shell config file like `~/.zshrc`).
+
+**Note:** You must use **`"direnv allow"`** when you change into the **transcribe** directory so that it can set the environment variables it needs to using the **`.envrc`** file.
+
+#### 🐧 **Ubuntu** (and WSL2)
+
+Install the prerequisites using the **Advanced Package Tool (`apt`)**.
+
+```bash
+$ sudo apt update
+$ sudo apt install -y make build-essential libssl-dev zlib1g-dev \\
+ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \\
+ libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev
+
+# Install pyenv, uv, and ffmpeg
+$ curl https://pyenv.run | bash
+$ curl -LsSf https://astral.sh/uv/install.sh | bash
+$ sudo apt install -y direnv
+$ sudo apt install -y ffmpeg
+```
+
+**Note:** After running the **`pyenv`** installation script, you must add the initialization commands (printed to your console) to your shell's configuration file (`~/.bashrc` or `~/.zshrc`) and then restart your terminal.
+
+**Note:** You must use **`"direnv allow"`** when you change into the **transcribe** directory so that it can set the environment variables it needs to using the **`.envrc`** file.
+
+#### 🪟 **Windows**
+
+For a smooth development experience, the recommended approach is to use the **Windows Subsystem for Linux (WSL2)** and follow the **Ubuntu** instructions above.
+
+---
+
+### 2. Project Setup
+
+The project uses a **`Makefile`** to simplify setup. Once your prerequisites are installed, you can set up the entire environment with a single command.
+
+#### **Step 2.1: Install Python and Create the Environment**
+
+The following command will automatically:
+1. Use `pyenv` to install the required Python version.
+2. Use `uv` to create the virtual environment (`.venv`).
+3. Use `uv` to install all project dependencies.
+4. Install **`pre-commit`** hooks.
+
+```bash
+# This command runs `pyenv install` and then `uv sync`
+$ make install
+```
+
+#### **Step 2.2: Activate the Environment**
+
+You can manually activate the virtual environment every time you open a new terminal to work on the project however, **`direnv`** should do this for you automatically based on our **`.envrc`** file.
+
+Here are the commands to activate your virtual python environment manually.
+
+```bash
+# For macOS/Ubuntu/WSL
+$ source .venv/bin/activate
+# For native Windows (cmd or PowerShell)
+# .venv\\Scripts\\activate
+```
+
+---
+
+### 3. Make Commands
+
+The project uses `make` targets to standardize common tasks. Ensure your virtual environment is **active** before running these commands.
+
+| Command | Description |
+| :--- | :--- |
+| `make install` | **Setup:** Install the virtual environment, dependencies, and pre-commit hooks. |
+| `make check` | **Quality:** Run code quality tools (linters/formatters, dependency checks, and type-checking). |
+| `make test` | **Quality:** Run the automated tests using `pytest`. |
+| `make docs-test` | **Quality:** Test if documentation can be built without warnings or errors. |
+| `make build` | **Distribution:** Build the distributable wheel (`.whl`) and source archive (`.tar.gz`) files in the `dist/` directory. |
+| `make clean-build` | **Cleanup:** Remove build artifacts from the `dist/` directory. |
+| `make docs` | **Documentation:** Build the documentation and serve it locally (usually at `http://127.0.0.1:8000`). |
+| `make man` | **Documentation:** Display the `transcribe` scripts `--help` output in the form of a `man` page. |
+| `make transcribe` | **Execution:** Interactively run the main application to transcribe video files to SRT subtitle files. |
+| `make help` | **Help:** Display this help message with descriptions for all targets. |
+
+---
+
+#### 3.1. Reading the Command "man" page.
+
+To see the options that you can give the `transcribe.py` script simple run the following:
+
+```bash
+# 1. Run the "man" target.
+$ make man
+```
+
+This will display the following "man" page:
+
+```bash
+$ make man
+usage: transcribe.py [-h] [--dry-run] [--include [INCLUDE ...]] [--exclude [EXCLUDE ...]] [--force] [--input-path INPUT_PATH] [--suffix SUFFIX] [--model {tiny.en,base.en,small.en,medium.en}] [--interactive] [--version]
+
+Transcribe audio files using a pre-trained model.
+
+options:
+ -h, --help show this help message and exit
+ --dry-run, -n Try a dry run without any actual transcription.
+ --include [INCLUDE ...]
+ A list of files or rglob patterns to include when processing. Defaults to **/*.mp4.
+ --exclude [EXCLUDE ...]
+ A list of files or rglob patterns to exclude from processing (overrides the include list).
+ --force Force overwrite of existing output SRT files.
+ --input-path INPUT_PATH
+ Directory containing input audio files (required in non-interactive mode).
+ --suffix SUFFIX Suffix of audio files to process (default: .mp4).
+ --model {tiny.en,base.en,small.en,medium.en}
+ Pre-trained model to use (default: base.en, available ['tiny.en', 'base.en', 'small.en', 'medium.en']).
+ --interactive Run in interactive mode, prompting for missing arguments.
+ --version, -v Show program's version number and exit.
+```
+
+Giving no arguments will cause the command to run in "interactive" mode, prompting you for any information you need.
+Supplying the arguments on the command-line gives you more control.
+You can override the interactive mode's defaults by supplying the `--interactive` option combined with the command options you want to override.
+
+#### 3.2. Running the Transcriber using "make"
+
+To run the main functionality of the project, use the dedicated "transcribe" target:
+
+```bash
+# 1. Run the interactive transcriber tool
+$ make transcribe
+```
+This will display the current transcription defaults and prompt you interactively for any defaults you want to change. See the next section for more details and an example.
+
+##### 3.2.1 Interacting with the Transcriber
+
+The `Makefile` **transcribe** target actually calls our script with the following arguments
+The **`uv run`** part ensures that we are running under the correct python environment:
+
+```make
+transcribe:
+ @uv run python src/transcriber/transcribe.py --interactive --exclude \
+ "_Model/sheets/jpgs/output.mp4" \
+ "_Model/OD_Textures/Open Source/AmbientCG/space-generation-success.mp4" \
+ "_Model/OD_Textures/Open Source/AmbientCG/space-generation-fail.mp4" \
+ "_Model/Animation/final video.mp4"
+```
+
+This `Makefile` target causes the script to run interactively but also excludes some of the mp4 videos,
+typically found in the **Bonsai_Tutorials** directory, which have no audio to transcribe.
+
+In *interactive mode* the script displays the current settings and then gives you
+the opportunity to override some of these defaults (the non-interactive mode lets you override
+anything with command-line options).
+
+Here is my attempt to use the `Makefile` to run our script and tweak it to use
+some non-defaults i.e.
+
+- my preferred path (`~/projects/Bonsai_Tutorials`)
+- the largest **Whisper** model available (`medium.en` instead of the default smallest model,`base.en`).
+
+Okay, let's run **`make transcribe`**:
+
+```bash
+$ make transcribe
+Entering interactive mode. Please provide the required information.
+Enter the directory with videos (default: .):
+```
+
+The first thing the script needs to know is where the video files live.
+We do not want the default (the current working directory) so we'll enter
+the location of our videos as being `~/projects/Bonsai_Tutorials`:
+
+```bash
+Enter the directory with videos (default: .): ~/projects/Bonsai_
+```
+
+The script then shows the current default settings and prompts you to see if you want to override the current defaults:
+
+```bash
+Current settings for transcribe version 1.0.0:
+ Suffix: .mp4
+ Model: base.en
+ Force overwrite: No
+ Dry run: No
+ Excluded patterns: (_Model/sheets/jpgs/output.mp4, _Model/OD_Textures/Open Source/AmbientCG/space-generation-success.srt, _Model/OD_Textures/Open Source/AmbientCG/space-generation-fail.srt, _Model/Animation/final video.srt)
+ Include patterns: (None)
+You will now be prompted for any changes to these settings.
+Enter suffix to process (or press Enter to keep '.mp4'):
+```
+We'll take the default **`suffix`** by hitting the `Enter` (or `Return`) key.
+
+Next, we are prompted to enter the **Whisper** model we want to use, the default is the smallest (**`base.en`**), which gives great results, but we will go with the largest model instead (**`medium,en`**). To be honest, the smallest model's results are pretty similar.
+
+We'll take the default for "Force overwrite" (No), this stops the script overwriting any existing **`.srt`** files).
+We'll also take the default for "Enable dry run mode" (No), this means the script will actually perform the transcription instead of just printing what it would have done.
+
+```bash
+Enter model to use (or press Enter to keep 'base.en', available tiny.en, base.en, small.en, medium.en): medium.en
+Force overwrite of existing SRT files? (y/N, default: N):
+Enable dry run mode? (y/N, default: N):
+```
+At this point, the script will output a summary of your choices and ask you to confirm if you want to proceed.
+
+```bash
+Confirm settings for transcribe version 1.0.0:
+ Suffix: .mp4
+ Model: medium.en
+ Force overwrite: No
+ Dry run: No
+ Excluded patterns: (_Model/sheets/jpgs/output.mp4, _Model/OD_Textures/Open Source/AmbientCG/space-generation-success.srt, _Model/OD_Textures/Open Source/AmbientCG/space-generation-fail.srt, _Model/Animation/final video.srt)
+ Include patterns: (None)
+
+Hit Enter to continue, or Ctrl-C to abort.
+```
+
+The script waits for you to confirm either by hitting the `Enter` (or `Return`) key or cancel by hitting `Ctrl-C`.
+
+We hit `Enter` and, as the CPU or GPU starts to glow white hot, we eventually get SRT subtitle text files as siblings to all the `.mp4` files we recursively found in our `Bonsai_Tutorials`.
+
+You should see quite a bit of output as the script processes each video.
+
+## Example of How I use the SRT files.
+
+To find a critical explanation, now that I have all the transcriptions available as `.srt` SRT subtitle text files, I can simply use any text searching tool I want to find the topic I'm interested in:
+
+```bash
+$ find Bonsai_Tutorials -name \*.srt -exec grep -i 'profiles' {} \; -print
+Go down to our profiles
+Bonsai_Tutorials/077000_20250303_1601 - Working with Arrays/077000_20250303_1601 - Working with Arrays.srt
+And I'm going to create a custom profile from that. So go down to our profiles and click on this object to pick it up.
+Bonsai_Tutorials/077000_20250303_1601 - Working with Arrays/077000_20250303_1601 - Working with Arrays.base.srt
+also you can purge unused profiles and sorry unused types as well but I'm not
+Bonsai_Tutorials/113000_20250418_1626 - Purging unused materials and styles from the file/113000_20250418_1626 - Purging unused materials and styles from the file.srt
+And there's also you can purge unused profiles and sorry unused types as well.
+Bonsai_Tutorials/113000_20250418_1626 - Purging unused materials and styles from the file/113000_20250418_1626 - Purging unused materials and styles from the file.base.srt
+To those profiles and layer sets.
+Bonsai_Tutorials/093000_20250312_1635 - Annotation tag types/093000_20250312_1635 - Annotation tag types.base.srt
+material was already signed to that to those profiles and layer sets.
+Bonsai_Tutorials/093000_20250312_1635 - Annotation tag types/093000_20250312_1635 - Annotation tag types.srt
+Click on this dropdown, you can see all the different types of profiles that IFC offers.
+Bonsai_Tutorials/069000_20250226_1738 - Adding strip footings/069000_20250226_1738 - Adding strip footings.base.srt
+Click on this drop down you can see all the different types of profiles that IFC offers
+Bonsai_Tutorials/069000_20250226_1738 - Adding strip footings/069000_20250226_1738 - Adding strip footings.srt
+You can pull in, you know, I've seen materials, profiles, and types.
+Bonsai_Tutorials/080000_20250304_1723 - pulling in content or assets from other files/080000_20250304_1723 - pulling in content or assets from other files.srt
+And you can pull in, I've seen materials, profiles and types.
+Bonsai_Tutorials/080000_20250304_1723 - pulling in content or assets from other files/080000_20250304_1723 - pulling in content or assets from other files.base.srt
+We're going to go to profiles and we're going to use this arbitrary, closed profile
+Bonsai_Tutorials/070000_20250227_0930 - Thickened edge with custom profile/070000_20250227_0930 - Thickened edge with custom profile.base.srt
+We're going to go to profiles and we're going to use this arbitrary closed profile def.
+Bonsai_Tutorials/070000_20250227_0930 - Thickened edge with custom profile/070000_20250227_0930 - Thickened edge with custom profile.srt
+The cabinets here are kind of just generic, massing cabinets. They're actually extruded profiles
+Bonsai_Tutorials/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls.base.srt
+They're actually extruded profiles if I tab into them.
+Bonsai_Tutorials/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls.srt
+```
+
+Armed with these clues, I can then use `vlc`, or some equivalent video player, and I can find the exact section of the video I need to watch.
+
+You can also use the timings in the SRT file to find the time the phrase occurred.
+
+Any advice for improvement much appreciated...
+
+AtDhVaAnNkCsE
+
+Doug Scoular
+dscoular@gmail.com
+2025/10/23
diff --git a/transcriber/docs/index.md b/transcriber/docs/index.md
new file mode 100644
index 0000000..eb1bf47
--- /dev/null
+++ b/transcriber/docs/index.md
@@ -0,0 +1,38 @@
+# transcriber
+
+[](https://img.shields.io/github/v/release/dscoular/transcriber)
+[](https://github.com/dscoular/transcriber/actions/workflows/main.yml?query=branch%3Amain)
+[](https://img.shields.io/github/commit-activity/m/dscoular/transcriber)
+[](https://img.shields.io/github/license/dscoular/transcriber)
+
+
+## Description
+
+This **`transcribe`** script is intended to be used, primarily, with the [Bonsai Tutorials](https://hub.openingdesign.com/OpeningDesign/Bonsai_Tutorials#readme) video collection
+to create SRT subtitle text files for the tutorial videos.
+
+Since there were so many videos it became difficult to remember which one contained
+a valuable explanation and exactly when in the video that explanation occurred.
+
+I found the [OpenAI Whisper](https://github.com/openai/whisper) python library and set about using it to
+transcribe the videos to SRT subtitle text files (thanks to the [pydub](https://github.com/jiaaro/pydub)
+and [pysrt](https://github.com/byroot/pysrt) modules).
+
+SRT subtitle text files are described by this Wikipedia entry:
+
+- [SubRip](https://en.wikipedia.org/wiki/SubRip)
+
+I used the [cookiecutter-uv](https://github.com/fpgmaas/cookiecutter-uv) project template to try to ensure that
+I had the basis of a modern python project.
+
+## Prerequisites
+
+You can either:
+
+1. Use python's [uv](https://docs.astral.sh/uv/) and **`make`** to manage the script's dependencies.
+ See the [🚀 Getting Started](getting-started.md) document for more details.
+2. Use the included **`Dockerfile`** and the **`docker`** command to make use of this script.
+ See the [🚢 Using Docker](docker.md) document for more details.
+
+***Notes***
+*Each matching video found in the target directory will have an `.srt` file created as a sibling. This makes it easy for video players to match the video with the subtitles.*
diff --git a/transcriber/docs/modules.md b/transcriber/docs/modules.md
new file mode 100644
index 0000000..fbac433
--- /dev/null
+++ b/transcriber/docs/modules.md
@@ -0,0 +1,13 @@
+# Module Documentation
+
+*Apologies for the sometimes poor formatting of text, it is machine generated by [mkdocstrings](https://mkdocstrings.github.io/).*
+
+Cheers
+
+*Doug Scoular*
+
+---
+
+::: transcriber.transcribe
+
+---
diff --git a/transcriber/helpers/docker-run.sh b/transcriber/helpers/docker-run.sh
new file mode 100755
index 0000000..3d7d3cd
--- /dev/null
+++ b/transcriber/helpers/docker-run.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+set -eu
+
+# Script usage: ./docker-run.sh [INPUT_DIR_HOST] [ARGS] [DOCKER_IMAGE_NAME]
+#
+# Description:
+# This script is only intended to be called from our Makefile to
+# ensure consistent Docker execution.
+
+# Parameters:
+# INPUT_DIR_HOST: (optional) Path to the input directory on the host machine.
+# If provided, it will be mounted to /mnt/user_videos in the container.
+# ARGS: Additional arguments to pass to the transcribe.py script.
+# DOCKER_IMAGE_NAME: Name of the Docker image to use.
+#
+
+INPUT_DIR_HOST="$1"
+ARGS="$2"
+DOCKER_IMAGE_NAME="$3"
+
+# 1. Set up base variables
+DOCKER_VOLUMES="-v \"$(pwd)\":/app"
+DOCKER_VOLUMES=""
+# ARGS already contains "--interactive" from the Makefile (passed via $2),
+# so we just prepend the base flag to ensure it's there.
+# Note: Since the Makefile already wraps this, we'll keep the logic simple here:
+
+RUN_ARGS="$ARGS"
+
+# 2. Conditional logic based on INPUT_DIR_HOST
+if [ -n "$INPUT_DIR_HOST" ]; then
+ # Check if the directory exists on the host
+ if [ ! -d "$INPUT_DIR_HOST" ]; then
+ echo "ERROR: INPUT_DIR_HOST='$INPUT_DIR_HOST' does not exist on your host system."
+ exit 1
+ fi
+
+ # Append the video volume mount
+ DOCKER_VOLUMES="$DOCKER_VOLUMES -v \"$INPUT_DIR_HOST\":/mnt/user_videos"
+
+ # Update arguments for the Python script
+ RUN_ARGS="--input-path /mnt/user_videos $RUN_ARGS"
+
+ echo " (Mounting host directory '$INPUT_DIR_HOST' to '/mnt/user_videos' in container.)"
+else
+ echo " (Project directory mounted. Run with INPUT_DIR_HOST=/path/to/your/videos to specify the input path.)"
+ echo " (Without it, the script will use its default input path (project root) in container.)"
+fi
+
+# 3. Execute the Docker command
+if [[ $RUN_ARGS == *"--interactive"* ]]; then
+ echo "🚀 Running transcriber in Docker (interactive):"
+else
+ echo "🚀 Running transcriber in Docker (non-interactive):"
+fi
+echo " - Use the ARGS variable on the "make" command-line to override default parameters."
+echo " - A default set of exclude file patterns is used and can be found in the Makefile."
+echo " - You can override this if you use \"ARGS=--exclude=''\" or edit the Makefile."
+# Using 'eval' to correctly parse the DOCKER_VOLUMES string,
+eval docker run --rm -it \
+ "$DOCKER_VOLUMES" \
+ -u "$(id -u):$(id -g)" \
+ "$DOCKER_IMAGE_NAME" \
+ /app/.venv/bin/python src/transcriber/transcribe.py "$RUN_ARGS"
diff --git a/transcriber/mkdocs.yml b/transcriber/mkdocs.yml
new file mode 100644
index 0000000..0d77e4e
--- /dev/null
+++ b/transcriber/mkdocs.yml
@@ -0,0 +1,71 @@
+site_name: transcriber
+repo_url: https://github.com/dscoular/transcriber
+site_url: https://dscoular.github.io/transcriber
+site_description: A python script which uses whisper to transcribe videos and outputs SRT files.
+site_author: Doug Scoular
+edit_uri: edit/main/docs/
+repo_name: dscoular/transcriber
+copyright: |
+ Copyright © 2025 Doug Scoular
+ All rights reserved. Licensed under the MIT license.
+nav:
+ - Home: index.md
+ - 🚀 Getting Started: getting-started.md
+ - Using Docker: docker.md
+ - Modules: modules.md
+ - Coverage: coverage.md
+plugins:
+ - search
+ - mkdocstrings:
+ handlers:
+ python:
+ paths: ["src/transcriber"]
+ options:
+ docstring_style: google
+ annotations_path: source
+ - coverage:
+ page_path: coverage
+ html_report_dir: htmlcov
+
+theme:
+ name: material
+ features:
+ - tabs: true
+ - content.code.copy
+ palette:
+ - media: "(prefers-color-scheme: light)"
+ scheme: default
+ primary: white
+ accent: deep orange
+ toggle:
+ icon: material/brightness-7
+ name: Switch to dark mode
+ - media: "(prefers-color-scheme: dark)"
+ scheme: slate
+ primary: black
+ accent: deep orange
+ toggle:
+ icon: material/brightness-4
+ name: Switch to light mode
+ icon:
+ repo: fontawesome/brands/github
+
+extra:
+ social:
+ - icon: fontawesome/brands/github
+ link: https://github.com/dscoular/transcriber
+ - icon: fontawesome/brands/python
+ link: https://pypi.org/project/transcriber
+
+markdown_extensions:
+ - toc:
+ permalink: true
+ - pymdownx.arithmatex:
+ generic: true
+ - pymdownx.highlight:
+ anchor_linenums: true
+ line_spans: __span
+ pygments_lang_class: true
+ - pymdownx.inlinehilite
+ - pymdownx.snippets
+ - pymdownx.superfences
diff --git a/transcriber/pyproject.toml b/transcriber/pyproject.toml
new file mode 100644
index 0000000..e4cb0ad
--- /dev/null
+++ b/transcriber/pyproject.toml
@@ -0,0 +1,200 @@
+[project]
+name = "transcriber"
+version = "0.0.1"
+description = "A python script which uses whisper to transcribe videos and outputs SRT files."
+authors = [{ name = "Doug Scoular", email = "dscoular@gmail.com" }]
+readme = "README.md"
+keywords = ['python']
+requires-python = ">=3.11,<4.0"
+classifiers = [
+ "Intended Audience :: Developers",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ # "Programming Language :: Python :: 3.13", Waiting for AudioSegment to be updated for 3.13.
+ "Topic :: Software Development :: Libraries :: Python Modules",
+]
+
+dependencies = [
+ "numpy",
+ "pysrt",
+ "openai-whisper",
+ "pydub"
+]
+
+[project.urls]
+Homepage = "https://dscoular.github.io/transcriber/"
+Repository = "https://github.com/dscoular/transcriber"
+Documentation = "https://dscoular.github.io/transcriber/"
+
+[project.scripts]
+transcriber = "transcriber.transcribe:main"
+
+[dependency-groups]
+dev = [
+ "coverage>=7.11.0",
+ "deptry>=0.23.0",
+ "mkdocs-coverage>=2.0.0",
+ "mkdocs-material>=8.5.10",
+ "mkdocs>=1.4.2",
+ "mkdocstrings[python]>=0.26.1",
+ "mypy>=0.991",
+ "pip-review>=1.3.0",
+ "pre-commit>=2.20.0",
+ "pysonar>=1.2.0",
+ "pytest-clarity>=1.0.1",
+ "pytest-cov>=4.0.0",
+ "pytest-mock>=3.15.0",
+ "pytest-sugar>=1.1.0",
+ "pytest>=7.2.0",
+ "ruff>=0.14.2",
+ "tox-uv>=1.29.0",
+]
+
+[project.optional-dependencies]
+dev = [
+ "coverage>=7.11.0",
+ "deptry>=0.23.0",
+ "mkdocs-coverage>=2.0.0",
+ "mkdocs-material>=9.6.22",
+ "mkdocs>=1.4.2",
+ "mkdocstrings[python]>=0.26.1",
+ "mypy>=0.991",
+ "pip-review>=1.3.0",
+ "pre-commit>=2.20.0",
+ "pysonar>=1.2.0",
+ "pytest-clarity>=1.0.1",
+ "pytest-cov>=4.0.0",
+ "pytest-mock>=3.15.0",
+ "pytest-sugar>=1.1.0",
+ "pytest>=7.2.0",
+ "ruff>=0.14.2",
+ "tox-uv>=1.29.0",
+]
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.hatch.build.targets.wheel]
+packages = ["src/transcriber"]
+
+[tool.mypy]
+files = ["src"]
+disallow_untyped_defs = true
+disallow_any_unimported = true
+no_implicit_optional = true
+check_untyped_defs = true
+warn_return_any = true
+warn_unused_ignores = true
+show_error_codes = true
+
+[[tool.mypy.overrides]]
+module = [
+ "pysrt",
+ "whisper",
+ "pydub",
+]
+ignore_missing_imports = true
+
+[tool.deptry.per_rule_ignores]
+DEP002 = [
+ "coverage",
+ "deptry",
+ "mkdocs",
+ "mkdocs-coverage",
+ "mkdocs-material",
+ "mkdocstrings",
+ "mypy",
+ "pip-review",
+ "pre-commit",
+ "pysonar",
+ "pytest",
+ "pytest-clarity",
+ "pytest-cov",
+ "pytest-mock",
+ "pytest-sugar",
+ "ruff",
+ "tox-uv",
+]
+
+[tool.pytest.ini_options]
+testpaths = ["tests"]
+addopts = [
+ "--cov=transcriber",
+ "--cov-report=term-missing",
+ "--cov-report=json",
+ "--cov-report=lcov",
+ "--cov-report=xml",
+ "--cov-report=html",
+ "--no-cov-on-fail"
+]
+# Hopefully pydub will get its act together upstream.
+filterwarnings = [
+ # Only suppress repetition for SyntaxWarning from pydub (covers "invalid escape sequence")
+ "once::SyntaxWarning:pydub.*",
+ # Only suppress repetition for deprecation warnings containing "audioop" from pydub.utils
+ "once:audioop:DeprecationWarning:pydub.utils",
+]
+
+[tool.ruff]
+target-version = "py312"
+line-length = 120
+fix = true
+
+[tool.ruff.lint]
+select = [
+ # flake8-2020
+ "YTT",
+ # flake8-bandit
+ "S",
+ # flake8-bugbear
+ "B",
+ # flake8-builtins
+ "A",
+ # flake8-comprehensions
+ "C4",
+ # flake8-debugger
+ "T10",
+ # flake8-simplify
+ "SIM",
+ # isort
+ "I",
+ # mccabe
+ "C90",
+ # pycodestyle
+ "E", "W",
+ # pyflakes
+ "F",
+ # pygrep-hooks
+ "PGH",
+ # pyupgrade
+ "UP",
+ # ruff
+ "RUF",
+ # tryceratops
+ "TRY",
+]
+# ignore = [
+ # LineTooLong
+ # "E501",
+ # DoNotAssignLambda
+ # "E731",
+# ]
+
+[tool.ruff.lint.per-file-ignores]
+# Allow assert() (S101) and long lines (E501) for all files in the tests directory.
+"tests/**" = ["S101", "E501"]
+# Apply the ignore for E501 in the docstring variable for the specific file
+
+[tool.ruff.format]
+preview = true
+
+[tool.coverage.report]
+skip_empty = true
+
+[tool.coverage.run]
+branch = true
+source = ["src"]
diff --git a/transcriber/src/transcriber/__init__.py b/transcriber/src/transcriber/__init__.py
new file mode 100644
index 0000000..e4a8914
--- /dev/null
+++ b/transcriber/src/transcriber/__init__.py
@@ -0,0 +1,24 @@
+# transcriber/transcriber.py
+
+"""
+Transcriber Module
+===================
+
+This module provides functionality to transcribe video files into SRT text
+files. It includes the Transcriber class, which handles the transcription process
+and the FileFilter class for filtering the list of files to be transcribed.
+
+Classes:
+--------
+- FileFilter: A class to filter video files based on specified criteria.
+- Transcriber: A class to transcribe video files into SRT format.
+
+Author: Doug Scoular
+
+Date: 2025-09-23
+
+SEE ALSO
+--------
+ The `transcribe` module for specific transcription details.
+
+"""
diff --git a/transcriber/src/transcriber/transcribe.py b/transcriber/src/transcriber/transcribe.py
new file mode 100644
index 0000000..30b9eb2
--- /dev/null
+++ b/transcriber/src/transcriber/transcribe.py
@@ -0,0 +1,456 @@
+#!/usr/bin/env python
+"""
+Transcribe video files to SRT subtitle text files using a pre-trained model.
+
+**Author:** Doug Scoular
+**Date:** 2025-09-16
+**Email:** dscoular@gmail.com
+
+**License:** MIT
+
+The main class that does all the work is **Transcribe** it employs
+an instance of the **FileFilter** class to find the video files it is going to
+process and turn into SRT subtitle text files.
+
+**Requirements:** *(see pyproject.toml for versions)*:
+
+- whisper (openai/whisper)
+- pysrt
+- numpy
+- AudioSegment (pydub)
+- ffmpeg (for audio decoding, must be installed separately into the Operating System)
+"""
+
+import argparse
+import sys
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+import pysrt
+import whisper
+from pydub import AudioSegment
+
+__VERSION__ = "1.0.0"
+
+
+class FileFilter:
+ """
+ A class which recursively searches the given input_path filtering files it finds
+ based on a matching filename "suffix" e.g. .mp4 combined with "include" and "exclude"
+ rglob patterns.
+
+ Examples:
+ >>> # Instantiating our FileFilter instance and obtaining matching files.
+ >>> filter = FileFilter(Path('.'),
+ ... '.mp4',
+ ... include_patterns=['**/*.mp4'],
+ ... exclude_patterns=['**/exclude_this.mp4'])
+ >>> matching_files = filter.get_matching_files()
+ >>> for file in matching_files:
+ >>> print(file)
+ foo.mp4
+ bar.mp4
+
+ Args:
+ input_path (Path): The root directory to scan for files.
+ suffix (Optional[str]): The file suffix to filter by (defaults to '.mp4').
+ include_patterns (Optional[list[str]]): List of glob patterns to include.
+ exclude_patterns (Optional[list[str]]): List of glob patterns to exclude.
+ """
+
+ def __init__(
+ self,
+ input_path: Path,
+ suffix: str | None = ".mp4",
+ include_patterns: list[str] | None = None,
+ exclude_patterns: list[str] | None = None,
+ ):
+ self.input_path = input_path.resolve()
+ self.suffix = suffix
+ # If the user provides no include patterns, the default is to find
+ # all files with the given suffix, recursively.
+ # First, remove any empty, duplicate patterns. Our argument parsing should have already handled this,
+ self.include_patterns = sorted({pattern for pattern in include_patterns or [] if pattern})
+ self.exclude_patterns = sorted({pattern for pattern in exclude_patterns or [] if pattern})
+ # Use the default include pattern if none provided.
+ self.include_patterns = include_patterns or [f"**/*{self.suffix}"]
+ # If no exclude patterns are provided, default to an empty list.
+ self.exclude_patterns = exclude_patterns or []
+
+ def get_matching_files(self) -> list[Path]:
+ """
+ Recursively Scans the self.input_path directory using
+ rglob patterns and returns a list of all files that match our
+ FileFilter instance's criteria (suffix, include_patterns and
+ exclude_patterns).
+
+ Returns:
+ A sorted list of Path objects matching the filter criteria.
+ """
+ included_files: set[Path] = set()
+ for pattern in self.include_patterns:
+ # Path.glob with '**' handles recursive search automatically.
+ # This correctly interprets patterns like '**/*.mkv'.
+ for file in self.input_path.glob(pattern):
+ if file.is_file():
+ included_files.add(file)
+
+ excluded_files: set[Path] = set()
+ for pattern in self.exclude_patterns:
+ for file in self.input_path.glob(pattern):
+ if file.is_file():
+ excluded_files.add(file)
+
+ # The final set of files is the difference between the two sets.
+ matching_files = sorted(included_files - excluded_files)
+
+ print(f"We matched {len(matching_files)} files.")
+ if excluded_files:
+ print("The following files were explicitly excluded by your exclude rules:")
+ for excluded_file in sorted(excluded_files):
+ print(f" EXCLUDED: [{excluded_file}]")
+
+ return matching_files
+
+
+class Transcriber:
+ """
+ A class to handle transcription of video files to SRT subtitle text files
+ using an OpenAI/Whisper pre-trained model. Takes our parsed command-line
+ arguments to instantiate an instance which we can then use to
+ transcribe videos to text.
+
+ Examples:
+ >>> # Manually create our arguments namespace.
+ >>> my_args = argparse.Namespace(input_path='/tmp/Bonsai_Tutorials')
+ >>> my_args.model = 'base.en' # Choose the smallest transcription model.
+ >>> my_args.force = True # Force overwriting existing ".srt" files.
+ >>> my_args.suffix = '.mp4' # Only consider ".mp4" files.
+ >>> # Include "rglob" patterns we are interested in.
+ >>> my_args.include = ['**/001000_20250218_1337 - moving objects and setting a few preferences.mp4']
+ >>> # Exclude "rglob" patterns we don't want to process.
+ >>> my_args.excluded = ['**/skip_this.mp4']
+ >>> my_args.dry_run = False # Actually process the files.
+ >>> my_args.interactive = False # Don't interactively prompt the user.
+ >>> # Instantiate our Transcriber instance with our arguments.
+ >>> transcriber = Transcriber(my_args)
+ >>> # Start the transcription process.
+ >>> transcriber.videos_to_text()
+ We matched 1 files.
+ PROCESSING: /tmp/Bonsai_Tutorials/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.mp4 -> /tmp/Bonsai_Tutorials/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.srt...
+ SUCCESS: Transcription saved to [/tmp/Bonsai_Tutorials/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.srt]
+ Transcription completed for all files.
+
+ Args:
+ args: Parsed command-line arguments.
+ """ # noqa: E501
+
+ # Instance variables with types (Python 3.6+ allows this)
+ force: bool
+ input_path: Path
+ model: Any # The whisper model type is not explicitly defined.
+ suffix: str
+ filter: FileFilter
+
+ def __init__(self, args: argparse.Namespace) -> None:
+ self.input_path = Path(args.input_path).expanduser()
+ self.force = args.force
+ self.model = args.model
+ self.suffix = args.suffix
+ self.dry_run = args.dry_run
+ self.filter = FileFilter(self.input_path, self.suffix, args.include, args.exclude)
+
+ def transcribe(self, input_file: Path) -> dict[str, Any] | None:
+ """
+ Transcribe the audio from the given video input file and returns a dictionary of
+ transcribed text and other relevant metadata. We return None if the transcription fails.
+
+ Examples:
+ >>> # Transcribe our video to our dictionary of subtitle metadata.
+ >>> srt_metadata = transcriber.transcribe("/path/to/video.mp4")
+ >>> pp srt_metadata
+ {
+ 'language': 'en',
+ 'segments': [{'avg_logprob': -0.18892038023317015,
+ 'compression_ratio': 1.5515463917525774,
+ 'end': 6.28,
+ 'id': 0,
+ 'no_speech_prob': 0.09762045741081238,
+ 'seek': 0,
+ 'start': 0.0,
+ 'temperature': 0.0,
+ 'text': ' Welcome to Vanilla Blender. I figured before we get into Bonsai we can go'
+ ...
+ }
+
+ Args:
+ input_file: The root directory to scan for files.
+ Returns:
+ A dictionary with a dictionary of transcription results, or None on failure.
+ """
+ try:
+ # pydub will internally use ffmpeg if it's available
+ # It will try to decode the MP4 directly.
+ # You might need to specify the format if pydub can't guess from the extension.
+ audio_segment: Any = AudioSegment.from_file(str(input_file))
+
+ # Crucially, ensure the audio is 16kHz, mono
+ # Whisper typically expects 16kHz mono float32
+ audio_segment = audio_segment.set_frame_rate(16000).set_channels(1)
+
+ audio_data: np.ndarray = np.frombuffer(audio_segment.get_array_of_samples(), dtype=np.int16)
+
+ # Convert to float32 and normalize
+ audio_data_float: np.ndarray = audio_data.astype(np.float32) / 32768.0
+
+ # Use whisper's transcribe method to get the transcription model.
+ model = whisper.load_model(self.model)
+ result: dict[str, Any] = model.transcribe(audio_data_float, fp16=False)
+ except (FileNotFoundError, ValueError, TypeError) as e:
+ # Catch known potential errors.
+ print(f"ERROR: skipping [{input_file}]: {e}")
+ return None # Skip this file on known errors.
+ # Return our transcribe() result.
+ return result
+
+ def videos_to_text(self) -> None:
+ """
+ Convert video files in the input path to audio and transcribe them to SRT text files
+ based on the arguments given when we instantiated our Transcriber class.
+ """
+ # Enumerate our input files.
+ for input_filename in sorted(self.filter.get_matching_files()):
+ if self.dry_run:
+ print(f"DRY RUN ENABLED, skipping actual transcription of [{input_filename}]")
+ continue
+ # Are we likely to overwrite an existing .srt file?
+ output_srt_file = input_filename.with_suffix(".srt")
+ if not self.force and output_srt_file.exists():
+ print(
+ f"SKIPPING: Transcription for [{input_filename}] already exists "
+ f"as [{output_srt_file}] (use --force to overwrite)."
+ )
+ continue
+
+ print(f"PROCESSING: {input_filename} -> {output_srt_file}...")
+ transcription: dict[str, Any] | None = None
+ try:
+ transcription = self.transcribe(input_filename)
+ except IndexError as err:
+ print(f"ERROR: Skipping [{input_filename}] due to [{err}]")
+ continue
+ if transcription:
+ # Create a SubRipFile object to hold the subtitles.
+ subs = pysrt.SubRipFile()
+ for i, segment in enumerate(transcription["segments"]):
+ start_time_ms = int(segment["start"] * 1000)
+ end_time_ms = int(segment["end"] * 1000)
+ text = segment["text"].strip()
+
+ # Create SubRipTime objects.
+ start_time = pysrt.SubRipTime(milliseconds=start_time_ms)
+ end_time = pysrt.SubRipTime(milliseconds=end_time_ms)
+
+ # Create a SubRipItem and add it to the file.
+ sub = pysrt.SubRipItem(index=i + 1, start=start_time, end=end_time, text=text)
+ subs.append(sub)
+
+ # Save the SRT file.
+ subs.save(output_srt_file, encoding="utf-8")
+
+ print(f"SUCCESS: Transcription saved to [{output_srt_file}]")
+ else:
+ print(f"ERROR: Empty transcribe() return value: [{input_filename}]")
+
+ print("Transcription completed for all files.")
+
+
+def validate_dot_suffix(value: str) -> str:
+ """
+ A custom argparse type that ensures the value is a string
+ starting with a dot '.'.
+
+ Args:
+ value: The input string to validate.
+
+ Returns:
+ The validated suffix string.
+
+ Raises:
+ argparse.ArgumentTypeError: If the value is invalid.
+ """
+ if not isinstance(value, str) or not value.startswith("."):
+ # This specific exception is caught by argparse and printed
+ # to the user as a clean error message.
+ print(f"invalid suffix: '{value}' (must start with a '.')")
+ raise argparse.ArgumentTypeError()
+ return value
+
+
+def parse_and_prompt_arguments(args: list[str] | None = None) -> argparse.Namespace:
+ """
+ Parse command-line arguments and prompt for a subset of missing ones if in interactive mode.
+ We don't bother prompting for "include" or "exclude" arguments since we would encourage
+ you to learn to use the command-line arguments for more advance usage.
+
+ Args:
+ args: List of command-line arguments to parse.
+
+
+ Returns:
+ The parsed command-line arguments.
+
+ Raises:
+ SystemExit: If version is requested or invalid input is provided.
+
+ """
+ # Define the full set of arguments
+ full_parser = argparse.ArgumentParser(description="Transcribe audio files using a pre-trained model.")
+ full_parser.add_argument(
+ "--dry-run", "-n", action="store_true", help="Try a dry run without any actual transcription."
+ )
+ full_parser.add_argument(
+ "--include",
+ type=str,
+ nargs="*",
+ help="A list of files or rglob patterns to include when processing. Defaults to **/*.mp4.",
+ )
+ full_parser.add_argument(
+ "--exclude",
+ type=str,
+ nargs="*",
+ help="A list of files or rglob patterns to exclude from processing (overrides the include list).",
+ )
+ full_parser.add_argument("--force", action="store_true", help="Force overwrite of existing output SRT files.")
+ full_parser.add_argument(
+ "--input-path", type=str, help="Directory containing input audio files (required in non-interactive mode)."
+ )
+ full_parser.add_argument(
+ "--suffix", type=validate_dot_suffix, default=".mp4", help="Suffix of audio files to process (default: .mp4)."
+ )
+ # List of available Whisper models
+ english_only_models_list = sorted([model for model in whisper._MODELS if model.endswith(".en")])
+ english_only_models_str = ", ".join(english_only_models_list)
+ full_parser.add_argument(
+ "--model",
+ type=str,
+ default="base.en",
+ choices=english_only_models_list,
+ help=f"Pre-trained model to use (default: base.en, available {english_only_models_str}).",
+ )
+ full_parser.add_argument(
+ "--interactive", action="store_true", help="Run in interactive mode, prompting for missing arguments."
+ )
+ full_parser.add_argument("--version", "-v", action="store_true", help="Show program's version number and exit.")
+
+ # First pass: Check for --interactive flag or no arguments
+ first_parser = argparse.ArgumentParser(add_help=False)
+ first_parser.add_argument("--interactive", action="store_true")
+ first_args, unknown_args = first_parser.parse_known_args(args)
+
+ # Case 1: No arguments supplied OR --interactive flag is present.
+ if not unknown_args or first_args.interactive:
+ # Parse arguments provided on the command line first
+ # This will set the values for any args that *were* provided,
+ # and leave others as their default or None.
+ parsed_args = full_parser.parse_args(args=unknown_args)
+ if parsed_args.version:
+ # Special handling for version in interactive mode.
+ print(f"transcribe version: {__VERSION__}")
+ sys.exit()
+
+ # Now enter interactive mode.
+ print("Entering interactive mode. Please provide the required information.")
+
+ # Prompt for missing arguments.
+ if parsed_args.input_path is None:
+ input_path = input("Enter the directory with videos (default: .): ").strip() or "."
+ parsed_args.input_path = input_path
+
+ # Enumerate include/exclude patterns to remove empties and duplicates.
+ parsed_args.exclude = sorted({pattern for pattern in parsed_args.exclude or [] if pattern})
+ parsed_args.include = sorted({pattern for pattern in parsed_args.include or [] if pattern})
+
+ # The other arguments have defaults, but you can still ask for
+ # confirmation or allow changes.
+ print(f"\nCurrent settings for transcribe version {__VERSION__}:")
+ print(f" Input Path: {parsed_args.input_path}")
+ print(f" Suffix: {parsed_args.suffix}")
+ print(f" Model: {parsed_args.model}")
+ print(f" Force overwrite: {'Yes' if parsed_args.force else 'No'}")
+ print(f" Dry run: {'Yes' if parsed_args.dry_run else 'No'}")
+ print(f" Excluded patterns: ({', '.join(parsed_args.exclude) if parsed_args.exclude else 'None'})")
+ print(f" Include patterns: ({', '.join(parsed_args.exclude) if parsed_args.include else 'None'})")
+ print("\nYou will now be prompted for any changes to these settings.")
+
+ # Prompt for changes to defaulted arguments.
+ # Ask the user if they want to change the suffix.
+ suffix = input(f"Enter suffix to process (or press Enter to keep '{parsed_args.suffix}'): ").strip()
+ # No suffix given, use our default.
+ if not suffix:
+ suffix = ".mp4"
+ parsed_args.suffix = validate_dot_suffix(suffix)
+ # Ask the user if they want to change the Whisper model.
+ model = input(
+ f"Enter model to use (or press Enter to keep '{parsed_args.model}', available {english_only_models_str}): "
+ ).strip()
+ parsed_args.model = model or "base.en"
+ # Perform validation on interactive model input, ignoring case.
+ if parsed_args.model not in english_only_models_list:
+ print("Invalid model selected. Exiting...")
+ sys.exit(1) # Barf...
+ # Ask the user if they want to force overwriting of existing SRT files.
+ force = (
+ input(f"Force overwrite of existing SRT files? (y/N, default: {'Y' if parsed_args.force else 'N'}): ")
+ .strip()
+ .lower()
+ )
+ if force == "y":
+ parsed_args.force = True
+ # Ask the user if they want to perform a "dry run" where no SRT files are written.
+ dry_run = input(f"Enable dry run mode? (y/N, default: {'Y' if parsed_args.dry_run else 'N'}): ").strip().lower()
+ if dry_run == "y":
+ parsed_args.dry_run = True
+
+ # Confirm the user's changes.
+ print(f"\nConfirm settings for transcribe version {__VERSION__}:")
+ print(f" Suffix: {parsed_args.suffix}")
+ print(f" Model: {parsed_args.model}")
+ print(f" Force overwrite: {'Yes' if parsed_args.force else 'No'}")
+ print(f" Dry run: {'Yes' if parsed_args.dry_run else 'No'}")
+ print(f" Excluded patterns: ({', '.join(parsed_args.exclude) if parsed_args.exclude else 'None'})")
+ print(f" Include patterns: ({', '.join(parsed_args.exclude) if parsed_args.include else 'None'})")
+ print("\nHit Enter to continue, or Ctrl-C to abort.")
+ input()
+
+ return parsed_args
+
+ else:
+ # Case 2: Arguments supplied, and not interactive mode.
+ parsed_args = full_parser.parse_args(unknown_args)
+ # Special handling for version in non-interactive mode.
+ if parsed_args.version:
+ print(f"transcribe version: {__VERSION__}")
+ sys.exit()
+ return parsed_args
+
+
+def main(args: list[str] | None = None) -> None:
+ """
+ Main function to run the transcriber.
+
+ Args:
+ args (Optional[list[str]]): List of command-line arguments to parse.
+ """
+ # Parse command-line arguments, prompting if needed.
+ parsed_args: argparse.Namespace = parse_and_prompt_arguments(args)
+ # Create a Transcriber instance and run the transcription.
+ transcriber: Transcriber = Transcriber(parsed_args)
+ # Start the transcription process.
+ transcriber.videos_to_text()
+
+
+# Entry point for script execution.
+if __name__ == "__main__":
+ main()
diff --git a/transcriber/tests/conftest.py b/transcriber/tests/conftest.py
new file mode 100644
index 0000000..329e44e
--- /dev/null
+++ b/transcriber/tests/conftest.py
@@ -0,0 +1,378 @@
+import argparse
+import array
+import builtins
+import sys
+from pathlib import Path
+
+import numpy as np
+import pytest
+import whisper
+
+
+@pytest.fixture(scope="session") # Or "function", "module", "class"
+def TEST_FILES():
+ """
+ Standard set of test files for the file structure fixture.
+ """
+ return [
+ "Bonsai_Tutorials/001000_20250218_1337 - moving objects and setting a few preferences/001000_20250218_1337 - moving objects and setting a few preferences.mp4",
+ "Bonsai_Tutorials/002000_20250218_1407 - moving, rotating, and scaling/002000_20250218_1407 - moving, rotating, and scaling.mp4",
+ "Bonsai_Tutorials/003000_20250218_1437 - 3d cursor/003000_20250218_1437 - 3d cursor.mp4",
+ "Bonsai_Tutorials/004000_20250218_1505 - duplicating, moving and rotating with base point/004000_20250218_1505 - duplicating, moving and rotating with base point.mp4",
+ "Bonsai_Tutorials/005000_20250218_1532 - edit mode and modifying vertices/005000_20250218_1532 - edit mode and modifying vertices.mp4",
+ "Bonsai_Tutorials/006000_20250218_1550 - extruding in edit mode/006000_20250218_1550 - extruding in edit mode.mp4",
+ "Bonsai_Tutorials/007000_20250218_1700 - various tools in edit mode/007000_20250218_1700 - various tools in edit mode.mp4",
+ "Bonsai_Tutorials/008000_20250218_1714 - quick favorites and redoing a bevel/008000_20250218_1714 - quick favorites and redoing a bevel.mp4",
+ "Bonsai_Tutorials/009000_20250218_1735 - dimensioning tools/009000_20250218_1735 - dimensioning tools.mp4",
+ "Bonsai_Tutorials/010000_20250218_1749 - changing view orientation/010000_20250218_1749 - changing view orientation.mp4",
+ "Bonsai_Tutorials/011000_20250218_1816 - Duplicate Linked/011000_20250218_1816 - Duplicate Linked.mp4",
+ "Bonsai_Tutorials/012000_20250218_1829 - Collection Instances/012000_20250218_1829 - Collection Instances.mp4",
+ "Bonsai_Tutorials/013000_20250219_1239 - moving geometry's origin/013000_20250219_1239 - moving geometry's origin.mp4",
+ "Bonsai_Tutorials/014000_20250219_1302 - Overview of Blender's interface/014000_20250219_1302 - Overview of Blender's interface.mp4",
+ "Bonsai_Tutorials/015000_20250219_1331 - resetting scale, rotation and origin location/015000_20250219_1331 - resetting scale, rotation and origin location.mp4",
+ "Bonsai_Tutorials/016000_20250219_1425 - Handy quick keys and a few gotchas/016000_20250219_1425 - Handy quick keys and a few gotchas.mp4",
+ "Bonsai_Tutorials/017000_20250219_1527 - Overview of Modifiers/017000_20250219_1527 - Overview of Modifiers.mp4",
+ "Bonsai_Tutorials/018000_20250219_1559 - Adding new geometry - Meshes and Curves/018000_20250219_1559 - Adding new geometry - Meshes and Curves.mp4",
+ "Bonsai_Tutorials/018500_20250220_0824 - Extruding a profile along a path/018500_20250220_0824 - Extruding a profile along a path.mp4",
+ "Bonsai_Tutorials/019000_20250219_1711 - Adding Text and Images on Planes/019000_20250219_1711 - Adding Text and Images on Planes.mp4",
+ "Bonsai_Tutorials/020000_20250220_0924 - Adding Lights/020000_20250220_0924 - Adding Lights.mp4",
+ "Bonsai_Tutorials/021000_20250220_1221 - Adding Cameras/021000_20250220_1221 - Adding Cameras.mp4",
+ "Bonsai_Tutorials/022000_20250220_1310 - Adding Empties/022000_20250220_1310 - Adding Empties.mp4",
+ "Bonsai_Tutorials/023000_20250220_1356 - relinking missing assets/023000_20250220_1356 - relinking missing assets.mp4",
+ "Bonsai_Tutorials/024000_20250220_1526 - Prep work before adding Materials/024000_20250220_1526 - Prep work before adding Materials.mp4",
+ "Bonsai_Tutorials/025000_20250220_1549 - Overview of a Material/025000_20250220_1549 - Overview of a Material.mp4",
+ "Bonsai_Tutorials/026000_20250220_1621 - Changing the material values and adding a texture/026000_20250220_1621 - Changing the material values and adding a texture.mp4",
+ "Bonsai_Tutorials/027000_20250220_1652 - Changing the texture's scale/027000_20250220_1652 - Changing the texture's scale.mp4",
+ "Bonsai_Tutorials/028000_20250220_1714 - Applying the texture correctly on all faces/028000_20250220_1714 - Applying the texture correctly on all faces.mp4",
+ "Bonsai_Tutorials/029000_20250220_1826 - Adding other PBR textures to the Material/029000_20250220_1826 - Adding other PBR textures to the Material.mp4",
+ "Bonsai_Tutorials/030000_20250221_1042 - Changing texture color and contrast/030000_20250221_1042 - Changing texture color and contrast.mp4",
+ "Bonsai_Tutorials/031000_20250221_1149 - Creating a new material from another/031000_20250221_1149 - Creating a new material from another.mp4",
+ "Bonsai_Tutorials/032000_20250221_1209 - Applying multiple materials to an object/032000_20250221_1209 - Applying multiple materials to an object.mp4",
+ "Bonsai_Tutorials/050000_20250221_1325 - Installing Bonsai - Stable Release/050000_20250221_1325 - Installing Bonsai - Stable Release.mp4",
+ "Bonsai_Tutorials/051000_20250221_1356 - Installing Bonsai - Unstable Release/051000_20250221_1356 - Installing Bonsai - Unstable Release.mp4",
+ "Bonsai_Tutorials/051500_20250224_1329 - Installing Bonsai - from Releases site/051500_20250224_1329 - Installing Bonsai - from Releases site.mp4",
+ "Bonsai_Tutorials/052000_20250224_1116 - Starting a demo project/052000_20250224_1116 - Starting a demo project.mp4",
+ "Bonsai_Tutorials/053000_20250224_1105 - Overview of the UI/053000_20250224_1105 - Overview of the UI.mp4",
+ "Bonsai_Tutorials/054000_20250224_1149 - Edit mode and changing your startup file/054000_20250224_1149 - Edit mode and changing your startup file.mp4",
+ "Bonsai_Tutorials/055000_20250224_1227 - Using GIT to see the DIFFs between IFC versions/055000_20250224_1227 -Using GIT to see the DIFFs between IFC versions.mp4",
+ "Bonsai_Tutorials/056000_20250224_1438 - Changing the class and attributes/056000_20250224_1438 - Changing the class and attributes.mp4",
+ "Bonsai_Tutorials/057000_20250224_1457 - Spatial containers and psets/057000_20250224_1457 - Spatial containers and psets.mp4",
+ "Bonsai_Tutorials/058000_20250224_1630 - Introduction to Types/058000_20250224_1630 - Introduction to Types.mp4",
+ "Bonsai_Tutorials/059000_20250224_1655 - Type psets and Qto's/059000_20250224_1655 - Type psets and Qto's.mp4",
+ "Bonsai_Tutorials/060000_20250226_1112 - Aggregates and Linked Aggregates/060000_20250226_1112 - Aggregates and Linked Aggregates.mp4",
+ "Bonsai_Tutorials/061000_20250226_1138 - Introduction to Materials and Styles/061000_20250226_1138 - Introduction to Materials and Styles.mp4",
+ "Bonsai_Tutorials/062000_20250226_1218 - Applying multiple styles or materials to one object/062000_20250226_1218 - Applying multiple styles or materials to one object.mp4",
+ "Bonsai_Tutorials/063000_20250226_1246 - External Styles/063000_20250226_1246 - External Styles.mp4",
+ "Bonsai_Tutorials/064000_20250226_1329 - Creating a Slab/064000_20250226_1329 - Creating a Slab.mp4",
+ "Bonsai_Tutorials/065000_20250226_1404 - Modifying the slab/065000_20250226_1404 - Modifying the slab.mp4",
+ "Bonsai_Tutorials/066000_20250226_1503 - Creating the basement slab/066000_20250226_1503 - Creating the basement slab.mp4",
+ "Bonsai_Tutorials/067000_20250226_1636 - Basement Walls/067000_20250226_1636 - Basement Walls.mp4",
+ "Bonsai_Tutorials/068000_20250226_1709 - Pulling a material from another library/068000_20250226_1709 - Pulling a material from another library.mp4",
+ "Bonsai_Tutorials/069000_20250226_1738 - Adding strip footings/069000_20250226_1738 - Adding strip footings.mp4",
+ "Bonsai_Tutorials/070000_20250227_0930 - Thickened edge with custom profile/070000_20250227_0930 - Thickened edge with custom profile.mp4",
+ "Bonsai_Tutorials/071000_20250228_1242 - Adding pipe segments/071000_20250228_1242 - Adding pipe segments.mp4",
+ "Bonsai_Tutorials/072000_20250228_1356 - Alternate approach to a pipe/072000_20250228_1356 - Alternate approach to a pipe.mp4",
+ "Bonsai_Tutorials/073000_20250228_1504 - Different way to select things and a little model clean up/073000_20250228_1504 - Different way to select things and a little model clean up.mp4",
+ "Bonsai_Tutorials/074000_20250228_1616 - Wall Tools/074000_20250228_1616 - Wall Tools.mp4",
+ "Bonsai_Tutorials/075000_20250303_1407 - An approach to naming wall types/075000_20250303_1407 - An approach to naming wall types.mp4",
+ "Bonsai_Tutorials/076000_20250303_1451 - Creating new beam type/076000_20250303_1451 - Creating new beam type.mp4",
+ "Bonsai_Tutorials/076000_20250303_1521 - Creating a recess in a wall/076000_20250303_1521 - Creating a recess in a wall.mp4",
+ "Bonsai_Tutorials/077000_20250303_1601 - Working with Arrays/077000_20250303_1601 - Working with Arrays.mp4",
+ "Bonsai_Tutorials/078000_20250304_1217 - Creating Parametric Stair/078000_20250304_1217 - Creating Parametric Stair.mp4",
+ "Bonsai_Tutorials/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry/079000_20250304_1357 - Creating risers by converting parametric stair to dumb geometry.mp4",
+ "Bonsai_Tutorials/080000_20250304_1723 - pulling in content or assets from other files/080000_20250304_1723 - pulling in content or assets from other files.mp4",
+ "Bonsai_Tutorials/081000_20250307_1247 - Walls now show their layers/081000_20250307_1247 - Walls now show their layers.mp4",
+ "Bonsai_Tutorials/082000_20250307_1338 - Pull in a wall type from template file and extending to slab/082000_20250307_1338 - Pull in a wall type from template file and extending to slab.mp4",
+ "Bonsai_Tutorials/083000_20250307_1451 - Creating linked aggregates for the floor assembly/083000_20250307_1451 - Creating linked aggregates for the floor assembly.mp4",
+ "Bonsai_Tutorials/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement/084000_20250310_1656 - Creating reference planes with a IfcVirtualElement.mp4",
+ "Bonsai_Tutorials/085000_20250310_1723 - Introduction to Drawings/085000_20250310_1723 - Introduction to Drawings.mp4",
+ "Bonsai_Tutorials/086000_20250310_1813 - Continue covering drawings/086000_20250310_1813 - Continue covering drawings.mp4",
+ "Bonsai_Tutorials/087000_20250311_1227 - Adding section and modifying section & level annotation/087000_20250311_1227 - Adding section and modifying section & level annotation.mp4",
+ "Bonsai_Tutorials/088000_20250311_1441 - Tweaking drawing styles/088000_20250311_1441 - Tweaking drawing styles.mp4",
+ "Bonsai_Tutorials/089000_20250311_1540 - Orthographic & Perspective drawings/089000_20250311_1540 - Orthographic & Perspective drawings.mp4",
+ "Bonsai_Tutorials/089000_20250311_1540 - Orthographic & Perspective drawings/20250311_1631.mp4",
+ "Bonsai_Tutorials/090000_20250311_1700 - Creating sheets and placing drawings/090000_20250311_1700 - Creating sheets and placing drawings.mp4",
+ "Bonsai_Tutorials/091000_20250312_1331 - Adding dimensions/091000_20250312_1331 - Adding dimensions.mp4",
+ "Bonsai_Tutorials/092000_20250312_1454 - Intelligent tags/092000_20250312_1454 - Intelligent tags.mp4",
+ "Bonsai_Tutorials/093000_20250312_1635 - Annotation tag types/093000_20250312_1635 - Annotation tag types.mp4",
+ "Bonsai_Tutorials/094000_20250313_1220 - going through the various asset folders/094000_20250313_1220 - going through the various asset folders.mp4",
+ "Bonsai_Tutorials/095000_20250313_1301 - Changing the default.css/095000_20250313_1301 - Changing the default.css.mp4",
+ "Bonsai_Tutorials/096000_20250313_1420 - Default_css and adding new css classes via Metadata property/096000_20250313_1420 - Default_css and adding new css classes via Metadata property.mp4",
+ "Bonsai_Tutorials/097000_20250313_1542 - Creating a demolition plan with CSS rules/097000_20250313_1542 - Creating a demolition plan with CSS rules.mp4",
+ "Bonsai_Tutorials/098000_20250313_1802 - Clean up demolition plan/098000_20250313_1802 - Clean up demolition plan.mp4",
+ "Bonsai_Tutorials/099000_20250314_1058 - Creating a new tag type/099000_20250314_1058 - Creating a new tag type.mp4",
+ "Bonsai_Tutorials/100000_20250314_1321 - Importing a CAD file/100000_20250314_1321 - Importing a CAD file.mp4",
+ "Bonsai_Tutorials/101000_20250314_1409 - Moving CAD import to paper space/101000_20250314_1409 - Moving CAD import to paper space.mp4",
+ "Bonsai_Tutorials/102000_20250314_1430 - Import background image/102000_20250314_1430 - Import background image.mp4",
+ "Bonsai_Tutorials/103000_20250317_1052 - Importing & modifying online BIM assets/103000_20250317_1052 - Importing & modifying online BIM assets.mp4",
+ "Bonsai_Tutorials/104000_20250408_1311 - A workaround with geometry based types/104000_20250408_1311 - A workaround with geometry based types.mp4",
+ "Bonsai_Tutorials/105000_20250408_1443 - A workaround when duplicating a type with a void/105000_20250408_1443 - A workaround when duplicating a type with a void.mp4",
+ "Bonsai_Tutorials/106000_20250408_1526 - Modifying the size of a geometry based type/106000_20250408_1526 - Modifying the size of a geometry based type.mp4",
+ "Bonsai_Tutorials/107000_20250411_1149 - Modeling in 2nd floor structure/107000_20250411_1149 - Modeling in 2nd floor structure.mp4",
+ "Bonsai_Tutorials/108000_20250414_1207 - Railings - parametric and arrayed/108000_20250414_1207 - Railings - parametric and arrayed.mp4",
+ "Bonsai_Tutorials/109000_20250415_1325 - Representation contexts as it relates to a door/109000_20250415_1325 - Representation contexts as it relates to a door.mp4",
+ "Bonsai_Tutorials/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata/110000_20250418_1054 - Refresher on using filters, default.css and using Metadata.mp4",
+ "Bonsai_Tutorials/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors/111000_20250418_1140 - Quickly flipping btwn drawings and working with doors.mp4",
+ "Bonsai_Tutorials/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library/112000_20250418_1503 - Working with Git submodules and syncing OD_Texture library.mp4",
+ "Bonsai_Tutorials/113000_20250418_1626 - Purging unused materials and styles from the file/113000_20250418_1626 - Purging unused materials and styles from the file.mp4",
+ "Bonsai_Tutorials/114000_20250418_1640 - Creating a working drawing style/114000_20250418_1640 - Creating a working drawing style.mp4",
+ "Bonsai_Tutorials/115000_20250507_1048 - Update on changes to model/115000_20250507_1048 - Update on changes to model.mp4",
+ "Bonsai_Tutorials/116000_20250507_1246 - Creating and editing roofs - 2 ways/116000_20250507_1246 - Creating and editing roofs - 2 ways.mp4",
+ "Bonsai_Tutorials/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets/117000_20250515_1158 - Intelligent text leaders and managing drawings not on sheets.mp4",
+ "Bonsai_Tutorials/118000_20250515_1255 - Copying annotation from one drawing to another/118000_20250515_1255 - Copying annotation from one drawing to another.mp4",
+ "Bonsai_Tutorials/119000_20250515_1651 - Creating IfcSpaces/119000_20250515_1651 - Creating IfcSpaces.mp4",
+ "Bonsai_Tutorials/120000_20250519_1124 - Using space tags/120000_20250519_1124 - Using space tags.mp4",
+ "Bonsai_Tutorials/121000_20250519_1627 - Creating schedules/121000_20250519_1627 - Creating schedules.mp4",
+ "Bonsai_Tutorials/122000_20250520_1011 - Creating a custom property with a property template/122000_20250520_1011 - Creating a custom property with a property template.mp4",
+ "Bonsai_Tutorials/123000_20250522_1356 - More about schedules/123000_20250522_1356 - More about schedules.mp4",
+ "Bonsai_Tutorials/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls/124000_20250522_1549 - Intro to Git and creating a floor outline with surrounding walls.mp4",
+ "Bonsai_Tutorials/125000_20250522_1658 - Modifying title sheets and drawing titles/125000_20250522_1658 - Modifying title sheets and drawing titles.mp4",
+ "Bonsai_Tutorials/126000_20250523_1122 - Starting the site modeling/126000_20250523_1122 - Starting the site modeling.mp4",
+ "Bonsai_Tutorials/127000_20250523_1509 - More site modification/127000_20250523_1509 - More site modification.mp4",
+ "Bonsai_Tutorials/128000_20250529_1545 - Model updates in prep for site layout/128000_20250529_1545 - Model updates in prep for site layout.mp4",
+ "Bonsai_Tutorials/129000_20250529_1627 - Laying out the site with housing types/129000_20250529_1627 - Laying out the site with housing types.mp4",
+ "Bonsai_Tutorials/130000_20250530_1436 - Creating the site plan/130000_20250530_1436 - Creating the site plan.mp4",
+ "Bonsai_Tutorials/131000_20250630_1310 - Style drawings based on the material's category and layer's material name/131000_20250630_1310 - Style drawings based on the material's category and layer's material name.mp4",
+ "Bonsai_Tutorials/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag/132000_20250701_1108 - Bringing objects to the front in drawings and using a faux intelligent tag.mp4",
+ "Bonsai_Tutorials/133000_20250701_1241 - Using pre-made SVG patterns from the web/133000_20250701_1241 - Using pre-made SVG patterns from the web.mp4",
+ "Bonsai_Tutorials/134000_20250701_1353 - Adding external SVG files to sheets/134000_20250701_1353 - Adding external SVG files to sheets.mp4",
+ "Bonsai_Tutorials/135000_20250701_1440 - Modifying the site's topography/135000_20250701_1440 - Modifying the site's topography.mp4",
+ "Bonsai_Tutorials/136000_20250711_1223 - Adding Entourage/136000_20250711_1223 - Adding Entourage.mp4",
+ "Bonsai_Tutorials/137000_20250909_1001 - Creating a new drawing pattern/137000_20250909_1001 - Creating a new drawing pattern.mp4",
+ "Bonsai_Tutorials/_Model/Animation/final video.mp4",
+ "Bonsai_Tutorials/_Model/sheets/jpgs/output.mp4",
+ # Outliers for testing.
+ "Bonsai_Tutorials/_Model/Animation/dummy test 1.mkv",
+ "Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.mkv",
+ ]
+
+
+class NoMoreTestInputsError(Exception):
+ """
+ Raised when the simulated input stream is exhausted.
+
+ Args:
+ message (str): Custom error message.
+ """
+
+ def __init__(self, message="No more input values available"):
+ super().__init__(message)
+
+
+class MockInputNotInitialisedError(RuntimeError):
+ """
+ Raised when the mock_input fixture's callable is used before inputs have been set.
+ """
+
+ def __init__(self, message: str = "Mock input not initialised. Call mock_input_callable(inputs_iter) first."):
+ super().__init__(message)
+
+
+@pytest.fixture
+def file_structure(tmp_path: Path, TEST_FILES: [str]) -> Path:
+ """Creates a standard directory and file structure for testing."""
+ for test_file in TEST_FILES:
+ file_path = tmp_path / test_file
+ file_path.parent.mkdir(parents=True, exist_ok=True)
+ file_path.touch()
+ return tmp_path
+
+
+@pytest.fixture
+def english_only_models_list() -> []:
+ """
+ Define English-only Whisper models to use in expected output.
+ """
+ english_only_models = [model for model in whisper._MODELS if model.endswith(".en")]
+ return sorted(english_only_models)
+
+
+@pytest.fixture
+def english_only_models_str(english_only_models_list) -> str:
+ """
+ Define English-only Whisper models to use in expected output.
+ """
+ return ", ".join(sorted(english_only_models_list))
+
+
+@pytest.fixture
+def help_text(english_only_models_list, english_only_models_str) -> str:
+ """Returns the expected help text for the CLI."""
+ return (
+ "usage: transcribe.py [-h] [--dry-run] [--include [INCLUDE ...]]\n"
+ " [--exclude [EXCLUDE ...]] [--force]\n"
+ " [--input-path INPUT_PATH] [--suffix SUFFIX]\n"
+ f" [--model {{{','.join(english_only_models_list)}}}]\n"
+ " [--interactive] [--version]\n"
+ "\n"
+ "Transcribe audio files using a pre-trained model.\n"
+ "\n"
+ "options:\n"
+ " -h, --help show this help message and exit\n"
+ " --dry-run, -n Try a dry run without any actual transcription.\n"
+ " --include [INCLUDE ...]\n"
+ " A list of files or rglob patterns to include when\n"
+ " processing. Defaults to **/*.mp4.\n"
+ " --exclude [EXCLUDE ...]\n"
+ " A list of files or rglob patterns to exclude from\n"
+ " processing (overrides the include list).\n"
+ " --force Force overwrite of existing output SRT files.\n"
+ " --input-path INPUT_PATH\n"
+ " Directory containing input audio files (required in\n"
+ " non-interactive mode).\n"
+ " --suffix SUFFIX Suffix of audio files to process (default: .mp4).\n"
+ f" --model {{{','.join(english_only_models_list)}}}\n"
+ " Pre-trained model to use (default: base.en, available\n"
+ f" {english_only_models_str}).\n"
+ " --interactive Run in interactive mode, prompting for missing\n"
+ " arguments.\n"
+ " --version, -v Show program's version number and exit.\n"
+ )
+
+
+@pytest.fixture
+def mock_args(tmp_path: Path):
+ """
+ Provides a mock argparse.Namespace object with standard arguments.
+
+ Options:
+ --dry-run: If set to True, the transcriber will simulate actions without making changes.
+ --include: List of glob patterns to include specific files.
+ --exclude: List of glob patterns to exclude specific files.
+ --force: If set to True, existing transcription files will be overwritten.
+ --input-path: Path to the directory containing video files to transcribe.
+ --suffix: Suffix for the video files to transcribe.
+ --model: Whisper model to use for transcription.
+ --interactive: If set to True, enables interactive mode for user prompts.
+ --version: If set to True, displays the version information and exit.
+ Note: No options triggers interactive mode by default.
+ Args:
+ tmp_path (Path): Temporary directory path provided by pytest.
+ """
+ # Ensure dry_run is part of the mock arguments object
+ return argparse.Namespace(
+ dry_run=False,
+ include=None,
+ exclude=None,
+ force=False,
+ input_path=str(tmp_path),
+ suffix=".mp4",
+ model="base.en",
+ interactive=False,
+ version=False,
+ )
+
+
+@pytest.fixture
+def clean_transcriber_module():
+ """
+ Fixture to ensure transcriber.transcribe is removed from sys.modules
+ before running tests that use runpy.run_module.
+ """
+ module_name = "transcriber.transcribe"
+ # Store original state
+ original_module = sys.modules.pop(module_name, None)
+ # Allow the test to run
+ yield
+ # Restore original state after test, if it existed
+ if original_module:
+ sys.modules[module_name] = original_module
+ # runpy will add it back, so no need to clean up after test if it was runpy's doing
+
+
+@pytest.fixture
+def mock_input(monkeypatch):
+ """
+ Fixture to mock builtins.input for interactive tests.
+
+ This fixture creates a callable that allows tests to supply a sequence of inputs.
+ It uses:
+ - =nonlocal=: To create a writable closure, allowing inner functions to modify
+ =input_iterator= from the fixture's scope.
+ - =yield=: To define setup (before =yield=) and teardown (after =yield=) logic
+ for the fixture, effectively returning a callable for test use.
+
+ Example:
+ >>> mock_input_callable = mock_input()
+ >>> mock_input_callable(iter(['input1', 'input2', ...]))
+ >>> # then proceed with your test that calls input()
+ """
+ original_input = builtins.input
+ input_iterator = None # Will be set by the test
+
+ def _mocked_input(prompt=""):
+ nonlocal input_iterator # Allows modification of input_iterator from outer scope
+ # Are we in the python debugger?
+ if prompt.startswith("(Pdb)"):
+ return original_input(prompt) # allow pdb to work
+ else:
+ # For application prompts, print them using our mock's mechanism
+ if prompt: # Only print if there's actually a prompt string
+ sys.stdout.write(prompt)
+ sys.stdout.flush() # Ensure the prompt is written immediately
+
+ if input_iterator is None:
+ raise MockInputNotInitialisedError
+ try:
+ user_input = next(input_iterator) # Get the user's simulated input
+ sys.stdout.write(user_input + "\n") # Mimic user typing and pressing Enter
+ sys.stdout.flush()
+ except StopIteration as e:
+ raise NoMoreTestInputsError from e
+ else:
+ return user_input # Return the input to the application
+
+ # This is the callable that the test will receive from the fixture.
+ # It allows the test to pass its specific inputs to the fixture.
+ def _set_inputs(inputs_iter):
+ nonlocal input_iterator # Allows modification of input_iterator from outer scope
+ input_iterator = inputs_iter
+ monkeypatch.setattr(builtins, "input", _mocked_input)
+ return _mocked_input # Return the actual mocked function if needed, though usually not
+
+ yield _set_inputs # Yields the callable for tests to use; everything after this is teardown
+
+ # Teardown: Restore original builtins.input after the test is done.
+ monkeypatch.setattr(builtins, "input", original_input)
+
+
+@pytest.fixture
+def mock_transcription_deps(mocker, monkeypatch):
+ """
+ Fixture to mock the primary dependencies for the transcription process:
+ pydub.AudioSegment.from_file and whisper.load_model.
+ """
+ # sample int16 data
+ samples = np.array([0, 1000, -1000, 32767, -32768], dtype=np.int16)
+ arr = array.array("h", samples.tolist()) # 'h' = signed short (int16)
+
+ # fake AudioSegment instance
+ fake_segment = mocker.MagicMock()
+ fake_segment.set_frame_rate.return_value = fake_segment
+ fake_segment.set_channels.return_value = fake_segment
+ fake_segment.get_array_of_samples.return_value = arr
+
+ # patch AudioSegment.from_file to return fake_segment.
+ mocker.patch("pydub.AudioSegment.from_file", return_value=fake_segment)
+ # Using mocker.patch here is generally preferred over monkeypatch.setattr
+ # because mocker automatically handles cleanup at the end of the test.
+
+ # Create our fake return value for the transcribe method.
+ fake_transcription = {
+ "segments": [
+ {"start": 0.0, "end": 5.0, "text": "This is a test transcription."},
+ {"start": 5.0, "end": 10.0, "text": "The transcription should be realistic."},
+ ]
+ }
+ # Create a return value for the mock model's transcribe method.
+ mock_model = mocker.Mock()
+ mock_model.transcribe.return_value = fake_transcription
+
+ # Patch the whisper.load_model to return our mock model.
+ mocker.patch("whisper.load_model", return_value=mock_model)
+
+ # If your tests ever need to inspect mock_model or fake_transcription,
+ # you could yield them as a tuple:
+ # yield mock_model, fake_transcription
+ # For now, simply yielding None (or just 'yield') is sufficient as the mocks are set globally.
+ yield
diff --git a/transcriber/tests/test_transcribe.py b/transcriber/tests/test_transcribe.py
new file mode 100644
index 0000000..8c7cb6f
--- /dev/null
+++ b/transcriber/tests/test_transcribe.py
@@ -0,0 +1,767 @@
+import argparse
+import contextlib
+import runpy
+import sys
+from pathlib import Path
+
+import pysrt
+import pytest
+
+from transcriber.transcribe import __VERSION__, FileFilter, Transcriber, main
+
+
+class TestFileFilter:
+ """
+ Tests for the glob-based FileFilter class.
+ """
+
+ def test_default_include_finds_all_suffix(self, file_structure: Path, TEST_FILES: list[str]):
+ """
+ Test the default behavior: finds all '.mp4' files recursively.
+ """
+ ff = FileFilter(file_structure, ".mp4")
+ files = ff.get_matching_files()
+ assert sorted([f.name for f in files]) == sorted([
+ Path(file).name for file in TEST_FILES if file.endswith(".mp4")
+ ])
+
+ def test_explicit_recursive_include(self, file_structure: Path):
+ """
+ Test user-provided recursive glob like '**/*.mkv'.
+ """
+ ff = FileFilter(file_structure, ".mkv", include_patterns=["**/*.mkv"])
+ files = ff.get_matching_files()
+ assert sorted([f.name for f in files]) == ["dummy test 1.mkv", "dummy test 2.mkv"]
+
+ def test_specific_include_pattern(self, file_structure: Path):
+ """
+ Test including files only from a specific directory and ensuring directories are ignored.
+ """
+ # For badness, create a dummy directory that matches the glob file pattern.
+ dummy_dir_path = file_structure / "Bonsai_Tutorials" / "_Model" / "Animation" / "dummy_folder.mkv"
+ dummy_dir_path.mkdir(parents=True, exist_ok=True) # Create it as a directory
+ # Run our filter.
+ ff = FileFilter(file_structure, ".mp4", include_patterns=["**/_Model/Animation/*.mkv"])
+ files = ff.get_matching_files()
+ assert [f.name for f in files] == ["dummy test 1.mkv"]
+ assert dummy_dir_path not in files # Explicitly confirm the directory is not included
+
+ def test_exclude_pattern(self, file_structure: Path, TEST_FILES: list[str]):
+ """
+ Test that exclusion patterns correctly filter files.
+ """
+ # For badness, create a dummy directory that matches the glob file pattern.
+ dummy_dir_path = file_structure / "Bonsai_Tutorials" / "_Model" / "Animation" / "dummy_folder.mkv"
+ dummy_dir_path.mkdir(parents=True, exist_ok=True) # Create it as a directory
+ ff = FileFilter(file_structure, ".mp4", exclude_patterns=["**/*.mkv"])
+ files = ff.get_matching_files()
+ assert sorted([f.name for f in files]) == sorted([
+ Path(file).name for file in TEST_FILES if file.endswith(".mp4")
+ ])
+
+ def test_exclude_overrides_include(self, file_structure: Path):
+ """
+ Test that exclusion rules always take precedence.
+ """
+ ff = FileFilter(
+ file_structure,
+ ".mp4",
+ include_patterns=["**/*.mp4"],
+ exclude_patterns=["**/final video.mp4"],
+ )
+ files = ff.get_matching_files()
+ assert "final video.mp4" not in sorted([f.name for f in files])
+
+
+class TestTranscriber:
+ """
+ Tests for the Transcriber class and main function.
+ """
+
+ def test_videos_to_text_processes_files(
+ self, mocker, mock_args: argparse.Namespace, mock_transcription_deps, file_structure: Path
+ ):
+ """
+ Test that videos_to_text processes the correct number of files.
+ """
+ mock_args.input_path = str(file_structure)
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ # Mock get_matching_files to return a list of 126 dummy .mp4 files
+ transcriber = Transcriber(mock_args)
+ mocker.patch.object(transcriber, "transcribe", return_value={"segments": []})
+
+ transcriber.videos_to_text()
+
+ # Should be called for the 126 .mp4 files found by the filter
+ assert transcriber.transcribe.call_count == 126
+
+ @pytest.mark.parametrize("option", ("-h", "--help"))
+ def test_help(self, capsys, option, help_text, monkeypatch, clean_transcriber_module):
+ """
+ Test that help option displays the correct help text.
+ """
+ # Act like we're running from command line.
+ monkeypatch.setattr(sys, "argv", ["transcribe.py", option])
+ with contextlib.suppress(SystemExit):
+ # Run module as __main__
+ runpy.run_module("transcriber.transcribe", run_name="__main__")
+
+ output = capsys.readouterr().out
+ # Did we get the expected help text?
+ assert output == help_text
+
+ @pytest.mark.parametrize("option", ("-v", "--version"))
+ def test_version(self, capsys, option, monkeypatch, clean_transcriber_module):
+ """
+ Test that version option displays the correct version text.
+ """
+ # Act like we're running from command line.
+ monkeypatch.setattr(sys, "argv", ["transcribe.py", option])
+ with contextlib.suppress(SystemExit):
+ # Run module as __main__
+ runpy.run_module("transcriber.transcribe", run_name="__main__")
+ output = capsys.readouterr().out
+ # Did we get the expected version text?
+ assert output == f"transcribe version: {__VERSION__}\n"
+
+ def test_bad_suffix(self, capsys, monkeypatch, clean_transcriber_module):
+ """
+ Test that a bad suffix, like one without a leading dot, is handled properly.
+ """
+ # Act like we're running from command line.
+ monkeypatch.setattr(sys, "argv", ["transcribe.py", "--suffix", "mp4"])
+ with contextlib.suppress(SystemExit):
+ # Run module as __main__
+ runpy.run_module("transcriber.transcribe", run_name="__main__")
+ output = capsys.readouterr().out
+ # Did we get the expected version text?
+ assert output == "invalid suffix: 'mp4' (must start with a '.')\n"
+
+ def test_version_overrides_interactive(self, capsys, monkeypatch, clean_transcriber_module):
+ """
+ Test that version option prints and exits overriding the interactive option.
+ """
+ # Act like we're running from command line.
+ monkeypatch.setattr(sys, "argv", ["transcribe.py", "--version", "--interactive"])
+ with contextlib.suppress(SystemExit):
+ # Run module as __main__
+ runpy.run_module("transcriber.transcribe", run_name="__main__")
+ output = capsys.readouterr().out
+ # Did we get the expected version text?
+ assert output == f"transcribe version: {__VERSION__}\n"
+
+ def test_transcribe(self, capsys, mocker, monkeypatch, file_structure: Path, mock_transcription_deps):
+ """
+ Test that main method calls the whisper model's transcribe method.
+ """
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+ with contextlib.suppress(SystemExit):
+ main(["--input-path", str(file_structure), "--suffix", ".mkv", "--force"])
+ sys.stdout.flush()
+ output = capsys.readouterr().out
+ # Define paths correctly, including the 'Bonsai_Tutorials' component
+ file1_path = file_structure / "Bonsai_Tutorials" / "_Model" / "Animation" / "dummy test 1.mkv"
+ file1_srt = file1_path.with_suffix(".srt")
+ file2_path = file_structure / "Bonsai_Tutorials" / "_Model" / "Animation" / "jpgs" / "dummy test 2.mkv"
+ file2_srt = file2_path.with_suffix(".srt")
+
+ # Set our expectations, now with full and dynamic paths for exact match.
+ great_expectations = (
+ f"We matched 2 files.\n"
+ f"PROCESSING: {file1_path} -> {file1_srt}...\n"
+ f"SUCCESS: Transcription saved to [{file1_srt}]\n"
+ f"PROCESSING: {file2_path} -> {file2_srt}...\n"
+ f"SUCCESS: Transcription saved to [{file2_srt}]\n"
+ f"Transcription completed for all files.\n"
+ )
+ assert output == great_expectations
+
+ def test_transcribe_dry_run(self, capsys, file_structure: Path, mock_transcription_deps):
+ """
+ Test that transcribe method doesn't call the whisper model's transcribe method
+ when dry run is enabled.
+ """
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ with contextlib.suppress(SystemExit):
+ main(["--input-path", str(file_structure), "--dry-run"])
+ output = capsys.readouterr().out
+ assert "We matched 126 files.\nDRY RUN ENABLED" in output
+ assert "Transcription completed for all files" in output
+
+ def test_interactive_prompting(
+ self,
+ capsys,
+ mocker,
+ monkeypatch,
+ file_structure: Path,
+ mock_input,
+ mock_transcription_deps,
+ english_only_models_str,
+ ):
+ """
+ Test that interactive prompting works as expected.
+ """
+ # Simulate user inputs for prompts.
+ input_path_str = str(file_structure) # Capture the path string once
+ inputs = iter([
+ input_path_str, # Video files input path.
+ ".mkv", # File suffix.
+ "medium.en", # Model name.
+ "n", # Force overwrite.
+ "", # Simulates hitting Enter to select the NO dry run default.
+ "", # Simulates hitting Enter to continue.
+ ])
+
+ # Use the fixture to set the inputs for builtins.input().
+ mock_input(inputs)
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ # Patch pysr.SubRipFile.save to avoid actual file writing.
+ mocker.patch.object(pysrt.SubRipFile, "save") # Mock saving SRT
+
+ with contextlib.suppress(SystemExit):
+ main(args=[])
+ sys.stdout.flush()
+ output = capsys.readouterr().out
+
+ # Set our expectations.
+ expected = (
+ f"Entering interactive mode. Please provide the required information.\n"
+ f"Enter the directory with videos (default: .): {input_path_str}\n"
+ f"\n" # This newline likely comes from the print before "Current settings"
+ f"Current settings for transcribe version {__VERSION__}:\n"
+ f" Input Path: {input_path_str}\n"
+ f" Suffix: .mp4\n"
+ f" Model: base.en\n"
+ f" Force overwrite: No\n"
+ f" Dry run: No\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Current settings" from "You will now be prompted".
+ f"You will now be prompted for any changes to these settings.\n"
+ f"Enter suffix to process (or press Enter to keep '.mp4'): .mkv\n"
+ f"Enter model to use (or press Enter to keep 'base.en', available {english_only_models_str}): medium.en\n"
+ f"Force overwrite of existing SRT files? (y/N, default: N): n\n"
+ f"Enable dry run mode? (y/N, default: N): \n"
+ f"\n" # This newline separates the last prompt from "Confirm settings".
+ f"Confirm settings for transcribe version {__VERSION__}:\n"
+ f" Suffix: .mkv\n"
+ f" Model: medium.en\n"
+ f" Force overwrite: No\n"
+ f" Dry run: No\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Confirm settings" from "Hit Enter to continue".
+ f"Hit Enter to continue, or Ctrl-C to abort.\n"
+ f"\n" # Newline for the final confirmation input
+ f"We matched 2 files.\n"
+ f"PROCESSING: {file_structure}/Bonsai_Tutorials/_Model/Animation/dummy test 1.mkv -> {file_structure}/Bonsai_Tutorials/_Model/Animation/dummy test 1.srt...\n"
+ f"SUCCESS: Transcription saved to [{file_structure}/Bonsai_Tutorials/_Model/Animation/dummy test 1.srt]\n"
+ f"PROCESSING: {file_structure}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.mkv -> {file_structure}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.srt...\n"
+ f"SUCCESS: Transcription saved to [{file_structure}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.srt]\n"
+ f"Transcription completed for all files.\n"
+ )
+ assert expected == output
+
+ def test_interactive_prompting_dry_run(
+ self, capsys, file_structure: Path, mock_input, mock_transcription_deps, english_only_models_str
+ ):
+ """
+ Test that interactive prompting works as expected in a dry run.
+ """
+ # Simulate user inputs for prompts.
+ input_path_str = str(file_structure) # Capture the path string once
+ inputs = iter([
+ input_path_str, # Video files input path.
+ ".mkv", # File suffix.
+ "medium.en", # Model name.
+ "n", # Force overwrite.
+ "y", # Dry run.
+ "", # Apparently, input will use this as if Enter was pressed.
+ ])
+
+ # Use the fixture to set the inputs for builtins.input().
+ mock_input(inputs)
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ with contextlib.suppress(SystemExit):
+ main(args=[])
+ sys.stdout.flush()
+ output = capsys.readouterr().out
+ # Set our expectations.
+ expected = (
+ f"Entering interactive mode. Please provide the required information.\n"
+ f"Enter the directory with videos (default: .): {input_path_str}\n"
+ f"\n" # This newline likely comes from the print before "Current settings"
+ f"Current settings for transcribe version {__VERSION__}:\n"
+ f" Input Path: {input_path_str}\n"
+ f" Suffix: .mp4\n"
+ f" Model: base.en\n"
+ f" Force overwrite: No\n"
+ f" Dry run: No\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Current settings" from "You will now be prompted".
+ f"You will now be prompted for any changes to these settings.\n"
+ f"Enter suffix to process (or press Enter to keep '.mp4'): .mkv\n"
+ f"Enter model to use (or press Enter to keep 'base.en', available {english_only_models_str}): medium.en\n"
+ f"Force overwrite of existing SRT files? (y/N, default: N): n\n"
+ f"Enable dry run mode? (y/N, default: N): y\n"
+ f"\n" # This newline separates the last prompt from "Confirm settings".
+ f"Confirm settings for transcribe version {__VERSION__}:\n"
+ f" Suffix: .mkv\n"
+ f" Model: medium.en\n"
+ f" Force overwrite: No\n"
+ f" Dry run: Yes\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Confirm settings" from "Hit Enter to continue".
+ f"Hit Enter to continue, or Ctrl-C to abort.\n"
+ f"\n" # Newline for the final confirmation input
+ f"We matched 2 files.\n"
+ f"DRY RUN ENABLED, skipping actual transcription of [{file_structure}/Bonsai_Tutorials/_Model/Animation/dummy test 1.mkv]\n"
+ f"DRY RUN ENABLED, skipping actual transcription of [{file_structure}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.mkv]\n"
+ f"Transcription completed for all files.\n"
+ )
+
+ assert expected == output
+
+ def test_interactive_prompting_force_true(
+ self, capsys, mocker, file_structure: Path, mock_input, mock_transcription_deps, english_only_models_str
+ ):
+ """
+ Test that interactive prompting correctly sets the --force option to True.
+ """
+ # Simulate user inputs for prompts.
+ input_path_str = str(file_structure) # Capture the path string once
+ inputs = iter([
+ input_path_str, # Video files input path.
+ ".mkv", # We'll test transcription of just the two mkv files.
+ "", # Keep default model (base.en).
+ "y", # Set Force overwrite to 'y' (True).
+ "n", # Set Dry run to 'n' (False).
+ "", # Simulate hitting Enter to continue.
+ ])
+
+ # Use the fixture to set the inputs for builtins.input().
+ mock_input(inputs)
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ # Patch Path.exists to always return False to give a clear path to transcription.
+ mocker.patch.object(Path, "exists", return_value=False) # Prevent skipping based on existing SRT
+ # Patch pysr.SubRipFile.save to avoid actual file writing.
+ mocker.patch.object(pysrt.SubRipFile, "save") # Mock saving SRT
+
+ with contextlib.suppress(SystemExit):
+ main(args=["--interactive"]) # Explicitly enter interactive mode
+ sys.stdout.flush()
+ output = capsys.readouterr().out
+
+ # More great expectations.
+ great_expectations = (
+ f"Entering interactive mode. Please provide the required information.\n"
+ f"Enter the directory with videos (default: .): {input_path_str}\n"
+ f"\n" # This newline likely comes from the print before "Current settings"
+ f"Current settings for transcribe version {__VERSION__}:\n"
+ f" Input Path: {input_path_str}\n"
+ f" Suffix: .mp4\n"
+ f" Model: base.en\n"
+ f" Force overwrite: No\n"
+ f" Dry run: No\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Current settings" from "You will now be prompted".
+ f"You will now be prompted for any changes to these settings.\n"
+ f"Enter suffix to process (or press Enter to keep '.mp4'): .mkv\n"
+ f"Enter model to use (or press Enter to keep 'base.en', available {english_only_models_str}): \n"
+ f"Force overwrite of existing SRT files? (y/N, default: N): y\n"
+ f"Enable dry run mode? (y/N, default: N): n\n"
+ f"\n" # This newline separates the last prompt from "Confirm settings".
+ f"Confirm settings for transcribe version {__VERSION__}:\n"
+ f" Suffix: .mkv\n"
+ f" Model: base.en\n"
+ f" Force overwrite: Yes\n"
+ f" Dry run: No\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Confirm settings" from "Hit Enter to continue".
+ f"Hit Enter to continue, or Ctrl-C to abort.\n"
+ f"\n" # Newline for the final confirmation input
+ f"We matched 2 files.\n"
+ "PROCESSING: "
+ f"{input_path_str}/Bonsai_Tutorials/_Model/Animation/dummy test 1.mkv -> "
+ f"{input_path_str}/Bonsai_Tutorials/_Model/Animation/dummy test 1.srt...\n"
+ "SUCCESS: Transcription saved to "
+ f"[{input_path_str}/Bonsai_Tutorials/_Model/Animation/dummy test 1.srt]\n"
+ f"PROCESSING: {input_path_str}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.mkv -> "
+ f"{input_path_str}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.srt...\n"
+ "SUCCESS: Transcription saved to "
+ f"[{input_path_str}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.srt]\n"
+ "Transcription completed for all files.\n"
+ )
+
+ assert output == great_expectations
+
+ def test_incorrect_interactive_prompting(
+ self,
+ capsys,
+ mocker,
+ monkeypatch,
+ file_structure: Path,
+ mock_input,
+ mock_transcription_deps,
+ english_only_models_str,
+ ):
+ """
+ Test that interactive prompting handles incorrect model input.
+ While not strictly necessary, we use mock_transcription_deps here to
+ ensure consistent mocking of dependencies.
+ """
+ # Simulate incorrect interactive user inputs for model.
+ input_path_str = str(file_structure) # Capture the path string once
+ inputs = iter([
+ input_path_str, # Video files input path.
+ ".mkv", # File suffix.
+ "foobar.en", # Model name.
+ "n", # Force overwrite.
+ "y", # Dry run.
+ "", # Apparently, input will use this as if Enter was pressed.
+ ])
+
+ # Use the fixture to set the inputs for builtins.input().
+ mock_input(inputs)
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ with contextlib.suppress(SystemExit):
+ main(args=[])
+ sys.stdout.flush()
+ output = capsys.readouterr().out
+ # Set our expectations.
+ expected = (
+ f"Entering interactive mode. Please provide the required information.\n"
+ f"Enter the directory with videos (default: .): {input_path_str}\n"
+ f"\n" # This newline likely comes from the print before "Current settings"
+ f"Current settings for transcribe version {__VERSION__}:\n"
+ f" Input Path: {input_path_str}\n"
+ f" Suffix: .mp4\n"
+ f" Model: base.en\n"
+ f" Force overwrite: No\n"
+ f" Dry run: No\n"
+ f" Excluded patterns: (None)\n"
+ f" Include patterns: (None)\n"
+ f"\n" # This newline separates "Current settings" from "You will now be prompted".
+ f"You will now be prompted for any changes to these settings.\n"
+ f"Enter suffix to process (or press Enter to keep '.mp4'): .mkv\n"
+ f"Enter model to use (or press Enter to keep 'base.en', available {english_only_models_str}): foobar.en\n"
+ f"Invalid model selected. Exiting...\n"
+ )
+
+ assert expected == output
+
+ def test_videos_to_text_skips_existing_files(
+ self, mock_args: argparse.Namespace, file_structure: Path, mocker: pytest.MonkeyPatch, capsys
+ ):
+ """
+ Test that our videos_to_text() method skips transcription if output SRT already exists and force is False.
+ """
+ mock_args.input_path = str(file_structure)
+ mock_args.force = False # Ensure force is False
+ transcriber = Transcriber(mock_args)
+
+ # Mock get_matching_files to return a single dummy file
+ dummy_mp4_file = file_structure / "Bonsai_Tutorials" / "videos" / "dummy_video.mp4"
+ mocker.patch.object(transcriber.filter, "get_matching_files", return_value=[dummy_mp4_file])
+
+ # Mock Path.exists for the expected SRT file to return True
+ # This will make output_srt_file.exists() return True
+ mocker.patch.object(Path, "exists", return_value=True)
+
+ # Mock the transcribe method to ensure it's NOT called
+ mock_transcribe = mocker.patch.object(transcriber, "transcribe")
+
+ transcriber.videos_to_text()
+
+ # Assert that transcribe was NOT called
+ mock_transcribe.assert_not_called()
+
+ # Capture output and check for the skipping message
+ output = capsys.readouterr().out
+
+ expected_skip_msg = (
+ f"SKIPPING: Transcription for [{dummy_mp4_file}] already exists "
+ f"as [{dummy_mp4_file.with_suffix('.srt')}] (use --force to overwrite).\n" # Added newline for consistency
+ f"Transcription completed for all files.\n"
+ )
+ assert output == expected_skip_msg
+
+ def test_videos_to_text_handles_indexerror_during_transcription(
+ self,
+ mock_args: argparse.Namespace,
+ file_structure: Path,
+ mocker: pytest.MonkeyPatch,
+ capsys,
+ mock_transcription_deps,
+ ):
+ """
+ Test that our videos_to_text() method handles IndexError during the transcribe call and continues.
+ """
+ mock_args.input_path = str(file_structure)
+ mock_args.force = True # Ensure force is True so it doesn't skip due to existing file
+ transcriber = Transcriber(mock_args)
+
+ # Mock get_matching_files to return a single dummy file
+ dummy_mkv_file = file_structure / "Bonsai_Tutorials" / "videos" / "other_videos" / "dummy_video.mkv"
+ mocker.patch.object(transcriber.filter, "get_matching_files", return_value=[dummy_mkv_file])
+
+ # Mock Path.exists to return False, so it tries to transcribe
+ mocker.patch.object(Path, "exists", return_value=False)
+
+ # Mock the transcribe method to raise IndexError
+ mock_transcribe = mocker.patch.object(transcriber, "transcribe", side_effect=IndexError("Mock index error"))
+
+ # Mock pysrt.SubRipFile().save() to ensure it's not called
+ mock_subs_save = mocker.patch.object(pysrt.SubRipFile, "save")
+
+ transcriber.videos_to_text()
+
+ # Assert that transcribe WAS called
+ mock_transcribe.assert_called_once_with(dummy_mkv_file)
+
+ # Assert that save was NOT called
+ mock_subs_save.assert_not_called()
+
+ # Capture output and check for the error message
+ output = capsys.readouterr().out
+ expected_error_msg = (
+ f"PROCESSING: {dummy_mkv_file} -> {dummy_mkv_file.with_suffix('.srt')}...\n"
+ f"ERROR: Skipping [{dummy_mkv_file}] due to [Mock index error]\n" # Added newline
+ f"Transcription completed for all files.\n"
+ )
+ assert output == expected_error_msg
+
+ def test_videos_to_text_handles_empty_transcription_result(
+ self,
+ mock_args: argparse.Namespace,
+ file_structure: Path,
+ mocker: pytest.MonkeyPatch,
+ mock_transcription_deps,
+ capsys,
+ ):
+ """
+ Test that our videos_to_text() method handles a None return from transcribe() gracefully.
+ """
+ mock_args.input_path = str(file_structure)
+ mock_args.force = True # Ensure force is True
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ transcriber = Transcriber(mock_args)
+
+ # Mock get_matching_files to return a single dummy file
+ dummy_mp4_file = file_structure / "Bonsai_Tutorials" / "videos" / "dummy_video.mp4"
+ mocker.patch.object(transcriber.filter, "get_matching_files", return_value=[dummy_mp4_file])
+
+ # Mock Path.exists to return False. Not sure why we bother.
+ mocker.patch.object(Path, "exists", return_value=False)
+
+ # Mock transcribe to return None
+ mock_transcribe = mocker.patch.object(transcriber, "transcribe", return_value=None)
+
+ # Mock pysrt.SubRipFile().save() to ensure it's not called
+ mock_subs_save = mocker.patch.object(pysrt.SubRipFile, "save")
+
+ transcriber.videos_to_text()
+
+ # Assert that transcribe WAS called.
+ mock_transcribe.assert_called_once_with(dummy_mp4_file)
+
+ # Assert that save was NOT called.
+ mock_subs_save.assert_not_called()
+
+ # Capture output and check for the error message.
+ output = capsys.readouterr().out
+ expected_error_msg = (
+ f"PROCESSING: {dummy_mp4_file} -> {dummy_mp4_file.with_suffix('.srt')}...\n"
+ f"ERROR: Empty transcribe() return value: [{dummy_mp4_file}]\n" # Added newline
+ f"Transcription completed for all files.\n"
+ )
+ assert output == expected_error_msg
+
+ def test_transcribe_handles_audio_loading_errors(
+ self,
+ mock_args: argparse.Namespace,
+ file_structure: Path,
+ mocker: pytest.MonkeyPatch,
+ mock_transcription_deps,
+ capsys,
+ ):
+ """
+ Test that our transcribe() method handles exceptions during audio loading (e.g., FileNotFoundError).
+ """
+
+ # The mocking of AudioSegment and Whisper model is now handled by mock_transcription_deps.
+ # Ensure specific configurations for mock_model (if yielded by fixture) needed are here.
+
+ transcriber = Transcriber(mock_args)
+
+ # Prepare a dummy input file path.
+ non_existent_file = file_structure / "Bonsai_Tutorials" / "non_existent_video.mp4"
+
+ # Mock AudioSegment.from_file to raise a FileNotFoundError.
+ mock_from_file = mocker.patch(
+ "pydub.AudioSegment.from_file", side_effect=FileNotFoundError("Mock file not found error")
+ )
+
+ # Call the transcribe method.
+ result = transcriber.transcribe(non_existent_file)
+
+ # Assert that AudioSegment.from_file was called with the correct path
+ mock_from_file.assert_called_once_with(str(non_existent_file))
+
+ # Assert that the transcribe method returned None.
+ assert result is None
+
+ # Capture output and check for the error message.
+ output = capsys.readouterr().out
+ expected_error_msg = f"ERROR: skipping [{non_existent_file}]: Mock file not found error\n"
+ assert output == expected_error_msg
+
+ def test_input_path(self, capsys, file_structure: Path, mock_input: argparse.Namespace, mocker):
+ """
+ Mock full_parser.parse_args() to return an input_path whose value
+ is None.
+ """
+ inputs = iter([
+ ".mkv", # File suffix.
+ "base.en", # Model name.
+ "n", # Force overwrite.
+ "y", # Dry run.
+ "", # Apparently, input will use this as if Enter was pressed.
+ ])
+
+ # Use the fixture to set the inputs for builtins.input().
+ mock_input(inputs)
+
+ input_path_str = str(file_structure) # Capture the path string once
+ with contextlib.suppress(SystemExit):
+ main(args=["--interactive", "--input-path", input_path_str])
+ output = capsys.readouterr().out
+ expected = (
+ "Entering interactive mode. Please provide the required information.\n"
+ "\n"
+ "Current settings for transcribe version 1.0.0:\n"
+ f" Input Path: {input_path_str}\n"
+ " Suffix: .mp4\n"
+ " Model: base.en\n"
+ " Force overwrite: No\n"
+ " Dry run: No\n"
+ " Excluded patterns: (None)\n"
+ " Include patterns: (None)\n"
+ "\n"
+ "You will now be prompted for any changes to these settings.\n"
+ "Enter suffix to process (or press Enter to keep '.mp4'): .mkv\n"
+ "Enter model to use (or press Enter to keep 'base.en', available base.en, "
+ "medium.en, small.en, tiny.en): base.en\n"
+ "Force overwrite of existing SRT files? (y/N, default: N): n\n"
+ "Enable dry run mode? (y/N, default: N): y\n"
+ "\n"
+ "Confirm settings for transcribe version 1.0.0:\n"
+ " Suffix: .mkv\n"
+ " Model: base.en\n"
+ " Force overwrite: No\n"
+ " Dry run: Yes\n"
+ " Excluded patterns: (None)\n"
+ " Include patterns: (None)\n"
+ "\n"
+ "Hit Enter to continue, or Ctrl-C to abort.\n"
+ "\n"
+ "We matched 2 files.\n"
+ f"DRY RUN ENABLED, skipping actual transcription of [{file_structure}/Bonsai_Tutorials/_Model/Animation/dummy test 1.mkv]\n"
+ f"DRY RUN ENABLED, skipping actual transcription of [{file_structure}/Bonsai_Tutorials/_Model/Animation/jpgs/dummy test 2.mkv]\n"
+ "Transcription completed for all files.\n"
+ )
+
+ assert output == expected
+
+ def test_suffix_none(self, capsys, file_structure: Path, mock_input: argparse.Namespace, mocker):
+ """
+ Mock full_parser.parse_args() to return an input_path whose value
+ is None.
+ """
+ input_path_str = str(file_structure)
+ inputs = iter([
+ input_path_str, # Video files input path.
+ "", # Empty File suffix.
+ "base.en", # Model name.
+ "n", # Force overwrite.
+ "y", # Dry run.
+ "", # Apparently, input will use this as if Enter was pressed.
+ ])
+
+ # Use the fixture to set the inputs for builtins.input().
+ mock_input(inputs)
+
+ with contextlib.suppress(SystemExit, argparse.ArgumentTypeError):
+ main(args=[])
+ output = capsys.readouterr().out
+ expected = (
+ "Entering interactive mode. Please provide the required information.\n"
+ f"Enter the directory with videos (default: .): {input_path_str}\n"
+ "\n"
+ "Current settings for transcribe version 1.0.0:\n"
+ f" Input Path: {input_path_str}\n"
+ " Suffix: .mp4\n"
+ " Model: base.en\n"
+ " Force overwrite: No\n"
+ " Dry run: No\n"
+ " Excluded patterns: (None)\n"
+ " Include patterns: (None)\n"
+ "\n"
+ "You will now be prompted for any changes to these settings.\n"
+ "Enter suffix to process (or press Enter to keep '.mp4'): \n"
+ "Enter model to use (or press Enter to keep 'base.en', available base.en, "
+ "medium.en, small.en, tiny.en): base.en\n"
+ "Force overwrite of existing SRT files? (y/N, default: N): n\n"
+ "Enable dry run mode? (y/N, default: N): y\n"
+ "\n"
+ "Confirm settings for transcribe version 1.0.0:\n"
+ " Suffix: .mp4\n"
+ " Model: base.en\n"
+ " Force overwrite: No\n"
+ " Dry run: Yes\n"
+ " Excluded patterns: (None)\n"
+ " Include patterns: (None)\n"
+ "\n"
+ "Hit Enter to continue, or Ctrl-C to abort.\n"
+ "\n"
+ "We matched 126 files.\n"
+ )
+ # append expected dry run lines for each matched file.
+ expected += (
+ "\n".join([
+ (
+ f"DRY RUN ENABLED, skipping actual transcription of "
+ f"[{file_structure}/Bonsai_Tutorials/"
+ f"{file_path.relative_to(file_structure / 'Bonsai_Tutorials')}]"
+ )
+ for file_path in sorted((file_structure / "Bonsai_Tutorials").rglob("*.mp4"))
+ ])
+ + "\n"
+ )
+ expected += "Transcription completed for all files.\n"
+ assert output == expected
diff --git a/transcriber/tox.ini b/transcriber/tox.ini
new file mode 100644
index 0000000..559604d
--- /dev/null
+++ b/transcriber/tox.ini
@@ -0,0 +1,18 @@
+[tox]
+skipsdist = true
+envlist = py39, py310, py311, py312, py313
+
+[gh-actions]
+python =
+ 3.9: py39
+ 3.10: py310
+ 3.11: py311
+ 3.12: py312
+ # 3.13: py313
+[testenv]
+passenv = PYTHON_VERSION
+allowlist_externals = uv
+commands =
+ uv sync --python {envpython}
+ uv run python -m pytest --doctest-modules tests --cov --cov-config=pyproject.toml --cov-report=xml
+ mypy
diff --git a/transcriber/uv.lock b/transcriber/uv.lock
new file mode 100644
index 0000000..af6af53
--- /dev/null
+++ b/transcriber/uv.lock
@@ -0,0 +1,1882 @@
+version = 1
+revision = 3
+requires-python = ">=3.11, <4.0"
+resolution-markers = [
+ "python_full_version >= '3.12'",
+ "python_full_version < '3.12'",
+]
+
+[[package]]
+name = "babel"
+version = "2.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" },
+]
+
+[[package]]
+name = "backrefs"
+version = "5.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" },
+ { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" },
+ { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" },
+ { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" },
+]
+
+[[package]]
+name = "cachetools"
+version = "6.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.10.5"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" },
+]
+
+[[package]]
+name = "cfgv"
+version = "3.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" },
+]
+
+[[package]]
+name = "chardet"
+version = "5.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload-time = "2023-08-01T19:23:02.662Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload-time = "2023-08-01T19:23:00.661Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" },
+ { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" },
+ { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" },
+ { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" },
+ { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" },
+ { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" },
+ { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" },
+ { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" },
+ { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
+ { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
+ { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
+ { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
+ { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
+ { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
+ { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
+ { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
+ { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
+ { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
+ { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
+ { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
+ { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
+ { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
+ { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
+ { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
+ { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
+ { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "coverage"
+version = "7.11.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/38/ee22495420457259d2f3390309505ea98f98a5eed40901cf62196abad006/coverage-7.11.0.tar.gz", hash = "sha256:167bd504ac1ca2af7ff3b81d245dfea0292c5032ebef9d66cc08a7d28c1b8050", size = 811905, upload-time = "2025-10-15T15:15:08.542Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/3a/ee1074c15c408ddddddb1db7dd904f6b81bc524e01f5a1c5920e13dbde23/coverage-7.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d58ecaa865c5b9fa56e35efc51d1014d4c0d22838815b9fce57a27dd9576847", size = 215912, upload-time = "2025-10-15T15:12:40.665Z" },
+ { url = "https://files.pythonhosted.org/packages/70/c4/9f44bebe5cb15f31608597b037d78799cc5f450044465bcd1ae8cb222fe1/coverage-7.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b679e171f1c104a5668550ada700e3c4937110dbdd153b7ef9055c4f1a1ee3cc", size = 216310, upload-time = "2025-10-15T15:12:42.461Z" },
+ { url = "https://files.pythonhosted.org/packages/42/01/5e06077cfef92d8af926bdd86b84fb28bf9bc6ad27343d68be9b501d89f2/coverage-7.11.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca61691ba8c5b6797deb221a0d09d7470364733ea9c69425a640f1f01b7c5bf0", size = 246706, upload-time = "2025-10-15T15:12:44.001Z" },
+ { url = "https://files.pythonhosted.org/packages/40/b8/7a3f1f33b35cc4a6c37e759137533119560d06c0cc14753d1a803be0cd4a/coverage-7.11.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aef1747ede4bd8ca9cfc04cc3011516500c6891f1b33a94add3253f6f876b7b7", size = 248634, upload-time = "2025-10-15T15:12:45.768Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/41/7f987eb33de386bc4c665ab0bf98d15fcf203369d6aacae74f5dd8ec489a/coverage-7.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1839d08406e4cba2953dcc0ffb312252f14d7c4c96919f70167611f4dee2623", size = 250741, upload-time = "2025-10-15T15:12:47.222Z" },
+ { url = "https://files.pythonhosted.org/packages/23/c1/a4e0ca6a4e83069fb8216b49b30a7352061ca0cb38654bd2dc96b7b3b7da/coverage-7.11.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e0eb0a2dcc62478eb5b4cbb80b97bdee852d7e280b90e81f11b407d0b81c4287", size = 246837, upload-time = "2025-10-15T15:12:48.904Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/03/ced062a17f7c38b4728ff76c3acb40d8465634b20b4833cdb3cc3a74e115/coverage-7.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bc1fbea96343b53f65d5351d8fd3b34fd415a2670d7c300b06d3e14a5af4f552", size = 248429, upload-time = "2025-10-15T15:12:50.73Z" },
+ { url = "https://files.pythonhosted.org/packages/97/af/a7c6f194bb8c5a2705ae019036b8fe7f49ea818d638eedb15fdb7bed227c/coverage-7.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:214b622259dd0cf435f10241f1333d32caa64dbc27f8790ab693428a141723de", size = 246490, upload-time = "2025-10-15T15:12:52.646Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/c3/aab4df02b04a8fde79068c3c41ad7a622b0ef2b12e1ed154da986a727c3f/coverage-7.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:258d9967520cca899695d4eb7ea38be03f06951d6ca2f21fb48b1235f791e601", size = 246208, upload-time = "2025-10-15T15:12:54.586Z" },
+ { url = "https://files.pythonhosted.org/packages/30/d8/e282ec19cd658238d60ed404f99ef2e45eed52e81b866ab1518c0d4163cf/coverage-7.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cf9e6ff4ca908ca15c157c409d608da77a56a09877b97c889b98fb2c32b6465e", size = 247126, upload-time = "2025-10-15T15:12:56.485Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/17/a635fa07fac23adb1a5451ec756216768c2767efaed2e4331710342a3399/coverage-7.11.0-cp311-cp311-win32.whl", hash = "sha256:fcc15fc462707b0680cff6242c48625da7f9a16a28a41bb8fd7a4280920e676c", size = 218314, upload-time = "2025-10-15T15:12:58.365Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/29/2ac1dfcdd4ab9a70026edc8d715ece9b4be9a1653075c658ee6f271f394d/coverage-7.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:865965bf955d92790f1facd64fe7ff73551bd2c1e7e6b26443934e9701ba30b9", size = 219203, upload-time = "2025-10-15T15:12:59.902Z" },
+ { url = "https://files.pythonhosted.org/packages/03/21/5ce8b3a0133179115af4c041abf2ee652395837cb896614beb8ce8ddcfd9/coverage-7.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:5693e57a065760dcbeb292d60cc4d0231a6d4b6b6f6a3191561e1d5e8820b745", size = 217879, upload-time = "2025-10-15T15:13:01.35Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/db/86f6906a7c7edc1a52b2c6682d6dd9be775d73c0dfe2b84f8923dfea5784/coverage-7.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9c49e77811cf9d024b95faf86c3f059b11c0c9be0b0d61bc598f453703bd6fd1", size = 216098, upload-time = "2025-10-15T15:13:02.916Z" },
+ { url = "https://files.pythonhosted.org/packages/21/54/e7b26157048c7ba555596aad8569ff903d6cd67867d41b75287323678ede/coverage-7.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a61e37a403a778e2cda2a6a39abcc895f1d984071942a41074b5c7ee31642007", size = 216331, upload-time = "2025-10-15T15:13:04.403Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/19/1ce6bf444f858b83a733171306134a0544eaddf1ca8851ede6540a55b2ad/coverage-7.11.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c79cae102bb3b1801e2ef1511fb50e91ec83a1ce466b2c7c25010d884336de46", size = 247825, upload-time = "2025-10-15T15:13:05.92Z" },
+ { url = "https://files.pythonhosted.org/packages/71/0b/d3bcbbc259fcced5fb67c5d78f6e7ee965f49760c14afd931e9e663a83b2/coverage-7.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16ce17ceb5d211f320b62df002fa7016b7442ea0fd260c11cec8ce7730954893", size = 250573, upload-time = "2025-10-15T15:13:07.471Z" },
+ { url = "https://files.pythonhosted.org/packages/58/8d/b0ff3641a320abb047258d36ed1c21d16be33beed4152628331a1baf3365/coverage-7.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80027673e9d0bd6aef86134b0771845e2da85755cf686e7c7c59566cf5a89115", size = 251706, upload-time = "2025-10-15T15:13:09.4Z" },
+ { url = "https://files.pythonhosted.org/packages/59/c8/5a586fe8c7b0458053d9c687f5cff515a74b66c85931f7fe17a1c958b4ac/coverage-7.11.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d3ffa07a08657306cd2215b0da53761c4d73cb54d9143b9303a6481ec0cd415", size = 248221, upload-time = "2025-10-15T15:13:10.964Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/ff/3a25e3132804ba44cfa9a778cdf2b73dbbe63ef4b0945e39602fc896ba52/coverage-7.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a3b6a5f8b2524fd6c1066bc85bfd97e78709bb5e37b5b94911a6506b65f47186", size = 249624, upload-time = "2025-10-15T15:13:12.5Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/12/ff10c8ce3895e1b17a73485ea79ebc1896a9e466a9d0f4aef63e0d17b718/coverage-7.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fcc0a4aa589de34bc56e1a80a740ee0f8c47611bdfb28cd1849de60660f3799d", size = 247744, upload-time = "2025-10-15T15:13:14.554Z" },
+ { url = "https://files.pythonhosted.org/packages/16/02/d500b91f5471b2975947e0629b8980e5e90786fe316b6d7299852c1d793d/coverage-7.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dba82204769d78c3fd31b35c3d5f46e06511936c5019c39f98320e05b08f794d", size = 247325, upload-time = "2025-10-15T15:13:16.438Z" },
+ { url = "https://files.pythonhosted.org/packages/77/11/dee0284fbbd9cd64cfce806b827452c6df3f100d9e66188e82dfe771d4af/coverage-7.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81b335f03ba67309a95210caf3eb43bd6fe75a4e22ba653ef97b4696c56c7ec2", size = 249180, upload-time = "2025-10-15T15:13:17.959Z" },
+ { url = "https://files.pythonhosted.org/packages/59/1b/cdf1def928f0a150a057cab03286774e73e29c2395f0d30ce3d9e9f8e697/coverage-7.11.0-cp312-cp312-win32.whl", hash = "sha256:037b2d064c2f8cc8716fe4d39cb705779af3fbf1ba318dc96a1af858888c7bb5", size = 218479, upload-time = "2025-10-15T15:13:19.608Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/55/e5884d55e031da9c15b94b90a23beccc9d6beee65e9835cd6da0a79e4f3a/coverage-7.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:d66c0104aec3b75e5fd897e7940188ea1892ca1d0235316bf89286d6a22568c0", size = 219290, upload-time = "2025-10-15T15:13:21.593Z" },
+ { url = "https://files.pythonhosted.org/packages/23/a8/faa930cfc71c1d16bc78f9a19bb73700464f9c331d9e547bfbc1dbd3a108/coverage-7.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:d91ebeac603812a09cf6a886ba6e464f3bbb367411904ae3790dfe28311b15ad", size = 217924, upload-time = "2025-10-15T15:13:23.39Z" },
+ { url = "https://files.pythonhosted.org/packages/60/7f/85e4dfe65e400645464b25c036a26ac226cf3a69d4a50c3934c532491cdd/coverage-7.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cc3f49e65ea6e0d5d9bd60368684fe52a704d46f9e7fc413918f18d046ec40e1", size = 216129, upload-time = "2025-10-15T15:13:25.371Z" },
+ { url = "https://files.pythonhosted.org/packages/96/5d/dc5fa98fea3c175caf9d360649cb1aa3715e391ab00dc78c4c66fabd7356/coverage-7.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f39ae2f63f37472c17b4990f794035c9890418b1b8cca75c01193f3c8d3e01be", size = 216380, upload-time = "2025-10-15T15:13:26.976Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/f5/3da9cc9596708273385189289c0e4d8197d37a386bdf17619013554b3447/coverage-7.11.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7db53b5cdd2917b6eaadd0b1251cf4e7d96f4a8d24e174bdbdf2f65b5ea7994d", size = 247375, upload-time = "2025-10-15T15:13:28.923Z" },
+ { url = "https://files.pythonhosted.org/packages/65/6c/f7f59c342359a235559d2bc76b0c73cfc4bac7d61bb0df210965cb1ecffd/coverage-7.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10ad04ac3a122048688387828b4537bc9cf60c0bf4869c1e9989c46e45690b82", size = 249978, upload-time = "2025-10-15T15:13:30.525Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/8c/042dede2e23525e863bf1ccd2b92689692a148d8b5fd37c37899ba882645/coverage-7.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4036cc9c7983a2b1f2556d574d2eb2154ac6ed55114761685657e38782b23f52", size = 251253, upload-time = "2025-10-15T15:13:32.174Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/a9/3c58df67bfa809a7bddd786356d9c5283e45d693edb5f3f55d0986dd905a/coverage-7.11.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ab934dd13b1c5e94b692b1e01bd87e4488cb746e3a50f798cb9464fd128374b", size = 247591, upload-time = "2025-10-15T15:13:34.147Z" },
+ { url = "https://files.pythonhosted.org/packages/26/5b/c7f32efd862ee0477a18c41e4761305de6ddd2d49cdeda0c1116227570fd/coverage-7.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59a6e5a265f7cfc05f76e3bb53eca2e0dfe90f05e07e849930fecd6abb8f40b4", size = 249411, upload-time = "2025-10-15T15:13:38.425Z" },
+ { url = "https://files.pythonhosted.org/packages/76/b5/78cb4f1e86c1611431c990423ec0768122905b03837e1b4c6a6f388a858b/coverage-7.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df01d6c4c81e15a7c88337b795bb7595a8596e92310266b5072c7e301168efbd", size = 247303, upload-time = "2025-10-15T15:13:40.464Z" },
+ { url = "https://files.pythonhosted.org/packages/87/c9/23c753a8641a330f45f221286e707c427e46d0ffd1719b080cedc984ec40/coverage-7.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8c934bd088eed6174210942761e38ee81d28c46de0132ebb1801dbe36a390dcc", size = 247157, upload-time = "2025-10-15T15:13:42.087Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/42/6e0cc71dc8a464486e944a4fa0d85bdec031cc2969e98ed41532a98336b9/coverage-7.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a03eaf7ec24078ad64a07f02e30060aaf22b91dedf31a6b24d0d98d2bba7f48", size = 248921, upload-time = "2025-10-15T15:13:43.715Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/1c/743c2ef665e6858cccb0f84377dfe3a4c25add51e8c7ef19249be92465b6/coverage-7.11.0-cp313-cp313-win32.whl", hash = "sha256:695340f698a5f56f795b2836abe6fb576e7c53d48cd155ad2f80fd24bc63a040", size = 218526, upload-time = "2025-10-15T15:13:45.336Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/d5/226daadfd1bf8ddbccefbd3aa3547d7b960fb48e1bdac124e2dd13a2b71a/coverage-7.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2727d47fce3ee2bac648528e41455d1b0c46395a087a229deac75e9f88ba5a05", size = 219317, upload-time = "2025-10-15T15:13:47.401Z" },
+ { url = "https://files.pythonhosted.org/packages/97/54/47db81dcbe571a48a298f206183ba8a7ba79200a37cd0d9f4788fcd2af4a/coverage-7.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:0efa742f431529699712b92ecdf22de8ff198df41e43aeaaadf69973eb93f17a", size = 217948, upload-time = "2025-10-15T15:13:49.096Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/8b/cb68425420154e7e2a82fd779a8cc01549b6fa83c2ad3679cd6c088ebd07/coverage-7.11.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:587c38849b853b157706407e9ebdca8fd12f45869edb56defbef2daa5fb0812b", size = 216837, upload-time = "2025-10-15T15:13:51.09Z" },
+ { url = "https://files.pythonhosted.org/packages/33/55/9d61b5765a025685e14659c8d07037247de6383c0385757544ffe4606475/coverage-7.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b971bdefdd75096163dd4261c74be813c4508477e39ff7b92191dea19f24cd37", size = 217061, upload-time = "2025-10-15T15:13:52.747Z" },
+ { url = "https://files.pythonhosted.org/packages/52/85/292459c9186d70dcec6538f06ea251bc968046922497377bf4a1dc9a71de/coverage-7.11.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:269bfe913b7d5be12ab13a95f3a76da23cf147be7fa043933320ba5625f0a8de", size = 258398, upload-time = "2025-10-15T15:13:54.45Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/e2/46edd73fb8bf51446c41148d81944c54ed224854812b6ca549be25113ee0/coverage-7.11.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dadbcce51a10c07b7c72b0ce4a25e4b6dcb0c0372846afb8e5b6307a121eb99f", size = 260574, upload-time = "2025-10-15T15:13:56.145Z" },
+ { url = "https://files.pythonhosted.org/packages/07/5e/1df469a19007ff82e2ca8fe509822820a31e251f80ee7344c34f6cd2ec43/coverage-7.11.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ed43fa22c6436f7957df036331f8fe4efa7af132054e1844918866cd228af6c", size = 262797, upload-time = "2025-10-15T15:13:58.635Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/50/de216b31a1434b94d9b34a964c09943c6be45069ec704bfc379d8d89a649/coverage-7.11.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9516add7256b6713ec08359b7b05aeff8850c98d357784c7205b2e60aa2513fa", size = 257361, upload-time = "2025-10-15T15:14:00.409Z" },
+ { url = "https://files.pythonhosted.org/packages/82/1e/3f9f8344a48111e152e0fd495b6fff13cc743e771a6050abf1627a7ba918/coverage-7.11.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb92e47c92fcbcdc692f428da67db33337fa213756f7adb6a011f7b5a7a20740", size = 260349, upload-time = "2025-10-15T15:14:02.188Z" },
+ { url = "https://files.pythonhosted.org/packages/65/9b/3f52741f9e7d82124272f3070bbe316006a7de1bad1093f88d59bfc6c548/coverage-7.11.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d06f4fc7acf3cabd6d74941d53329e06bab00a8fe10e4df2714f0b134bfc64ef", size = 258114, upload-time = "2025-10-15T15:14:03.907Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/8b/918f0e15f0365d50d3986bbd3338ca01178717ac5678301f3f547b6619e6/coverage-7.11.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:6fbcee1a8f056af07ecd344482f711f563a9eb1c2cad192e87df00338ec3cdb0", size = 256723, upload-time = "2025-10-15T15:14:06.324Z" },
+ { url = "https://files.pythonhosted.org/packages/44/9e/7776829f82d3cf630878a7965a7d70cc6ca94f22c7d20ec4944f7148cb46/coverage-7.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dbbf012be5f32533a490709ad597ad8a8ff80c582a95adc8d62af664e532f9ca", size = 259238, upload-time = "2025-10-15T15:14:08.002Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/b8/49cf253e1e7a3bedb85199b201862dd7ca4859f75b6cf25ffa7298aa0760/coverage-7.11.0-cp313-cp313t-win32.whl", hash = "sha256:cee6291bb4fed184f1c2b663606a115c743df98a537c969c3c64b49989da96c2", size = 219180, upload-time = "2025-10-15T15:14:09.786Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/e1/1a541703826be7ae2125a0fb7f821af5729d56bb71e946e7b933cc7a89a4/coverage-7.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a386c1061bf98e7ea4758e4313c0ab5ecf57af341ef0f43a0bf26c2477b5c268", size = 220241, upload-time = "2025-10-15T15:14:11.471Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/d1/5ee0e0a08621140fd418ec4020f595b4d52d7eb429ae6a0c6542b4ba6f14/coverage-7.11.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f9ea02ef40bb83823b2b04964459d281688fe173e20643870bb5d2edf68bc836", size = 218510, upload-time = "2025-10-15T15:14:13.46Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/06/e923830c1985ce808e40a3fa3eb46c13350b3224b7da59757d37b6ce12b8/coverage-7.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c770885b28fb399aaf2a65bbd1c12bf6f307ffd112d6a76c5231a94276f0c497", size = 216110, upload-time = "2025-10-15T15:14:15.157Z" },
+ { url = "https://files.pythonhosted.org/packages/42/82/cdeed03bfead45203fb651ed756dfb5266028f5f939e7f06efac4041dad5/coverage-7.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a3d0e2087dba64c86a6b254f43e12d264b636a39e88c5cc0a01a7c71bcfdab7e", size = 216395, upload-time = "2025-10-15T15:14:16.863Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/ba/e1c80caffc3199aa699813f73ff097bc2df7b31642bdbc7493600a8f1de5/coverage-7.11.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73feb83bb41c32811973b8565f3705caf01d928d972b72042b44e97c71fd70d1", size = 247433, upload-time = "2025-10-15T15:14:18.589Z" },
+ { url = "https://files.pythonhosted.org/packages/80/c0/5b259b029694ce0a5bbc1548834c7ba3db41d3efd3474489d7efce4ceb18/coverage-7.11.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c6f31f281012235ad08f9a560976cc2fc9c95c17604ff3ab20120fe480169bca", size = 249970, upload-time = "2025-10-15T15:14:20.307Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/86/171b2b5e1aac7e2fd9b43f7158b987dbeb95f06d1fbecad54ad8163ae3e8/coverage-7.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9570ad567f880ef675673992222746a124b9595506826b210fbe0ce3f0499cd", size = 251324, upload-time = "2025-10-15T15:14:22.419Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/7e/7e10414d343385b92024af3932a27a1caf75c6e27ee88ba211221ff1a145/coverage-7.11.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8badf70446042553a773547a61fecaa734b55dc738cacf20c56ab04b77425e43", size = 247445, upload-time = "2025-10-15T15:14:24.205Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/3b/e4f966b21f5be8c4bf86ad75ae94efa0de4c99c7bbb8114476323102e345/coverage-7.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a09c1211959903a479e389685b7feb8a17f59ec5a4ef9afde7650bd5eabc2777", size = 249324, upload-time = "2025-10-15T15:14:26.234Z" },
+ { url = "https://files.pythonhosted.org/packages/00/a2/8479325576dfcd909244d0df215f077f47437ab852ab778cfa2f8bf4d954/coverage-7.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:5ef83b107f50db3f9ae40f69e34b3bd9337456c5a7fe3461c7abf8b75dd666a2", size = 247261, upload-time = "2025-10-15T15:14:28.42Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/d8/3a9e2db19d94d65771d0f2e21a9ea587d11b831332a73622f901157cc24b/coverage-7.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f91f927a3215b8907e214af77200250bb6aae36eca3f760f89780d13e495388d", size = 247092, upload-time = "2025-10-15T15:14:30.784Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/b1/bbca3c472544f9e2ad2d5116b2379732957048be4b93a9c543fcd0207e5f/coverage-7.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbcd376716d6b7fbfeedd687a6c4be019c5a5671b35f804ba76a4c0a778cba4", size = 248755, upload-time = "2025-10-15T15:14:32.585Z" },
+ { url = "https://files.pythonhosted.org/packages/89/49/638d5a45a6a0f00af53d6b637c87007eb2297042186334e9923a61aa8854/coverage-7.11.0-cp314-cp314-win32.whl", hash = "sha256:bab7ec4bb501743edc63609320aaec8cd9188b396354f482f4de4d40a9d10721", size = 218793, upload-time = "2025-10-15T15:14:34.972Z" },
+ { url = "https://files.pythonhosted.org/packages/30/cc/b675a51f2d068adb3cdf3799212c662239b0ca27f4691d1fff81b92ea850/coverage-7.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d4ba9a449e9364a936a27322b20d32d8b166553bfe63059bd21527e681e2fad", size = 219587, upload-time = "2025-10-15T15:14:37.047Z" },
+ { url = "https://files.pythonhosted.org/packages/93/98/5ac886876026de04f00820e5094fe22166b98dcb8b426bf6827aaf67048c/coverage-7.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:ce37f215223af94ef0f75ac68ea096f9f8e8c8ec7d6e8c346ee45c0d363f0479", size = 218168, upload-time = "2025-10-15T15:14:38.861Z" },
+ { url = "https://files.pythonhosted.org/packages/14/d1/b4145d35b3e3ecf4d917e97fc8895bcf027d854879ba401d9ff0f533f997/coverage-7.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f413ce6e07e0d0dc9c433228727b619871532674b45165abafe201f200cc215f", size = 216850, upload-time = "2025-10-15T15:14:40.651Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/d1/7f645fc2eccd318369a8a9948acc447bb7c1ade2911e31d3c5620544c22b/coverage-7.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:05791e528a18f7072bf5998ba772fe29db4da1234c45c2087866b5ba4dea710e", size = 217071, upload-time = "2025-10-15T15:14:42.755Z" },
+ { url = "https://files.pythonhosted.org/packages/54/7d/64d124649db2737ceced1dfcbdcb79898d5868d311730f622f8ecae84250/coverage-7.11.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cacb29f420cfeb9283b803263c3b9a068924474ff19ca126ba9103e1278dfa44", size = 258570, upload-time = "2025-10-15T15:14:44.542Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/3f/6f5922f80dc6f2d8b2c6f974835c43f53eb4257a7797727e6ca5b7b2ec1f/coverage-7.11.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314c24e700d7027ae3ab0d95fbf8d53544fca1f20345fd30cd219b737c6e58d3", size = 260738, upload-time = "2025-10-15T15:14:46.436Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/5f/9e883523c4647c860b3812b417a2017e361eca5b635ee658387dc11b13c1/coverage-7.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:630d0bd7a293ad2fc8b4b94e5758c8b2536fdf36c05f1681270203e463cbfa9b", size = 262994, upload-time = "2025-10-15T15:14:48.3Z" },
+ { url = "https://files.pythonhosted.org/packages/07/bb/43b5a8e94c09c8bf51743ffc65c4c841a4ca5d3ed191d0a6919c379a1b83/coverage-7.11.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e89641f5175d65e2dbb44db15fe4ea48fade5d5bbb9868fdc2b4fce22f4a469d", size = 257282, upload-time = "2025-10-15T15:14:50.236Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/e5/0ead8af411411330b928733e1d201384b39251a5f043c1612970310e8283/coverage-7.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c9f08ea03114a637dab06cedb2e914da9dc67fa52c6015c018ff43fdde25b9c2", size = 260430, upload-time = "2025-10-15T15:14:52.413Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/66/03dd8bb0ba5b971620dcaac145461950f6d8204953e535d2b20c6b65d729/coverage-7.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce9f3bde4e9b031eaf1eb61df95c1401427029ea1bfddb8621c1161dcb0fa02e", size = 258190, upload-time = "2025-10-15T15:14:54.268Z" },
+ { url = "https://files.pythonhosted.org/packages/45/ae/28a9cce40bf3174426cb2f7e71ee172d98e7f6446dff936a7ccecee34b14/coverage-7.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:e4dc07e95495923d6fd4d6c27bf70769425b71c89053083843fd78f378558996", size = 256658, upload-time = "2025-10-15T15:14:56.436Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/7c/3a44234a8599513684bfc8684878fd7b126c2760f79712bb78c56f19efc4/coverage-7.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:424538266794db2861db4922b05d729ade0940ee69dcf0591ce8f69784db0e11", size = 259342, upload-time = "2025-10-15T15:14:58.538Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/e6/0108519cba871af0351725ebdb8660fd7a0fe2ba3850d56d32490c7d9b4b/coverage-7.11.0-cp314-cp314t-win32.whl", hash = "sha256:4c1eeb3fb8eb9e0190bebafd0462936f75717687117339f708f395fe455acc73", size = 219568, upload-time = "2025-10-15T15:15:00.382Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/76/44ba876e0942b4e62fdde23ccb029ddb16d19ba1bef081edd00857ba0b16/coverage-7.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b56efee146c98dbf2cf5cffc61b9829d1e94442df4d7398b26892a53992d3547", size = 220687, upload-time = "2025-10-15T15:15:02.322Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/0c/0df55ecb20d0d0ed5c322e10a441775e1a3a5d78c60f0c4e1abfe6fcf949/coverage-7.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b5c2705afa83f49bd91962a4094b6b082f94aef7626365ab3f8f4bd159c5acf3", size = 218711, upload-time = "2025-10-15T15:15:04.575Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/04/642c1d8a448ae5ea1369eac8495740a79eb4e581a9fb0cbdce56bbf56da1/coverage-7.11.0-py3-none-any.whl", hash = "sha256:4b7589765348d78fb4e5fb6ea35d07564e387da2fc5efff62e0222971f155f68", size = 207761, upload-time = "2025-10-15T15:15:06.439Z" },
+]
+
+[package.optional-dependencies]
+toml = [
+ { name = "tomli", marker = "python_full_version <= '3.11'" },
+]
+
+[[package]]
+name = "deptry"
+version = "0.23.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "packaging" },
+ { name = "requirements-parser" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/31/3e2f4a9b43bd807b28a49d673b9b5f8dcc7265d43950b24e875ba90e6205/deptry-0.23.1.tar.gz", hash = "sha256:5d23e0ef25f3c56405c05383a476edda55944563c5c47a3e9249ed3ec860d382", size = 460016, upload-time = "2025-07-31T05:54:49.681Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/d0/9785c0e7fdab12f5324467d70ba65ad03b9d4071a13fc182b6d98bab6208/deptry-0.23.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f0b231d098fb5b48d8973c9f192c353ffdd395770063424969fa7f15ddfea7d8", size = 1768731, upload-time = "2025-07-31T05:54:47.348Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/4b/46aded35e0de153936b2214e49e5935179eed9f23cbd3a9a0cd9a5ab0abd/deptry-0.23.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf057f514bb2fa18a2b192a7f7372bd14577ff46b11486933e8383dfef461983", size = 1667240, upload-time = "2025-07-31T05:54:43.956Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/f7/206330f68280a1af7edb8bea87f383dbaa4e3b02b37199d40f86e4c43048/deptry-0.23.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ee3f5663bb1c048e2aaf25a4d9e6d09cc1f3b3396ee248980878c6a6c9c0e21", size = 1772019, upload-time = "2025-07-31T05:54:31.165Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/80/51a9e94349b47013e2fd78fd221b12202a7866cd2e0882cfd87d63055e88/deptry-0.23.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae0366dc5f50a5fb29cf90de1110c5e368513de6c1b2dac439f2817f3f752616", size = 1855973, upload-time = "2025-07-31T05:54:37.733Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/7a/bff10ddd26ce39c56a9a35bdc98fcf44c2befe5954c8da4bb895e3f750bb/deptry-0.23.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ab156a90a9eda5819aeb1c1da585dd4d5ec509029399a38771a49e78f40db90f", size = 1946957, upload-time = "2025-07-31T05:54:34.567Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/b6/c80b190cbd817d1f75f8d02d4b6f4d430b2f3014a09d3895684e291e473b/deptry-0.23.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:651c7eb168233755152fcc468713c024d64a03069645187edb4a17ba61ce6133", size = 2025282, upload-time = "2025-07-31T05:54:40.906Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/58/1dfb7a6c4ec2daf123264d2c30f53f45791fee46cd0244be5bf97597d2aa/deptry-0.23.1-cp39-abi3-win_amd64.whl", hash = "sha256:8da1e8f70e7086ebc228f3a4a3cfb5aa127b09b5eef60d694503d6bb79809025", size = 1631377, upload-time = "2025-07-31T05:54:51.951Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d3/667b974cf42fc50245a8028beb9966643ee214ca567cc6df6e876feca5ed/deptry-0.23.1-cp39-abi3-win_arm64.whl", hash = "sha256:f589497a5809717db4dcf2aa840f2847c0a4c489331608e538850b6a9ab1c30b", size = 1551113, upload-time = "2025-07-31T05:54:50.679Z" },
+]
+
+[[package]]
+name = "distlib"
+version = "0.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
+]
+
+[[package]]
+name = "filelock"
+version = "3.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" },
+]
+
+[[package]]
+name = "fsspec"
+version = "2025.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/de/e0/bab50af11c2d75c9c4a2a26a5254573c0bd97cea152254401510950486fa/fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19", size = 304847, upload-time = "2025-09-02T19:10:49.215Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/47/71/70db47e4f6ce3e5c37a607355f80da8860a33226be640226ac52cb05ef2e/fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7", size = 199289, upload-time = "2025-09-02T19:10:47.708Z" },
+]
+
+[[package]]
+name = "ghp-import"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "python-dateutil" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" },
+]
+
+[[package]]
+name = "griffe"
+version = "1.14.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload-time = "2025-09-05T15:02:29.167Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload-time = "2025-09-05T15:02:27.511Z" },
+]
+
+[[package]]
+name = "identify"
+version = "2.6.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "jproperties"
+version = "2.1.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/be/27/00abf648c6d573275d409b70196b66d9fb40ef03b8d1baf671ae3774e145/jproperties-2.1.2.tar.gz", hash = "sha256:036fcd52c10a8a1c21e6fa2a1c292c93892e759b76490acc4809213a36ddc329", size = 23860, upload-time = "2024-07-21T20:40:50.29Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/75/6f/55bc5837e9fe7a86a5acb553adec901257d709062bfaef7debd4d8cfee12/jproperties-2.1.2-py2.py3-none-any.whl", hash = "sha256:4108e868353a9f4a12bb86a92df5462d0e18d00119169533972ce473029be79a", size = 17981, upload-time = "2024-07-21T20:40:49.034Z" },
+]
+
+[[package]]
+name = "llvmlite"
+version = "0.45.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/99/8d/5baf1cef7f9c084fb35a8afbde88074f0d6a727bc63ef764fe0e7543ba40/llvmlite-0.45.1.tar.gz", hash = "sha256:09430bb9d0bb58fc45a45a57c7eae912850bedc095cd0810a57de109c69e1c32", size = 185600, upload-time = "2025-10-01T17:59:52.046Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/ad/9bdc87b2eb34642c1cfe6bcb4f5db64c21f91f26b010f263e7467e7536a3/llvmlite-0.45.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:60f92868d5d3af30b4239b50e1717cb4e4e54f6ac1c361a27903b318d0f07f42", size = 43043526, upload-time = "2025-10-01T18:03:15.051Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/ea/c25c6382f452a943b4082da5e8c1665ce29a62884e2ec80608533e8e82d5/llvmlite-0.45.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98baab513e19beb210f1ef39066288784839a44cd504e24fff5d17f1b3cf0860", size = 37253118, upload-time = "2025-10-01T18:04:06.783Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/af/85fc237de98b181dbbe8647324331238d6c52a3554327ccdc83ced28efba/llvmlite-0.45.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3adc2355694d6a6fbcc024d59bb756677e7de506037c878022d7b877e7613a36", size = 56288209, upload-time = "2025-10-01T18:01:00.168Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/df/3daf95302ff49beff4230065e3178cd40e71294968e8d55baf4a9e560814/llvmlite-0.45.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f3377a6db40f563058c9515dedcc8a3e562d8693a106a28f2ddccf2c8fcf6ca", size = 55140958, upload-time = "2025-10-01T18:02:11.199Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/56/4c0d503fe03bac820ecdeb14590cf9a248e120f483bcd5c009f2534f23f0/llvmlite-0.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9c272682d91e0d57f2a76c6d9ebdfccc603a01828cdbe3d15273bdca0c3363a", size = 38132232, upload-time = "2025-10-01T18:04:52.181Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/7c/82cbd5c656e8991bcc110c69d05913be2229302a92acb96109e166ae31fb/llvmlite-0.45.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:28e763aba92fe9c72296911e040231d486447c01d4f90027c8e893d89d49b20e", size = 43043524, upload-time = "2025-10-01T18:03:30.666Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/bc/5314005bb2c7ee9f33102c6456c18cc81745d7055155d1218f1624463774/llvmlite-0.45.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1a53f4b74ee9fd30cb3d27d904dadece67a7575198bd80e687ee76474620735f", size = 37253123, upload-time = "2025-10-01T18:04:18.177Z" },
+ { url = "https://files.pythonhosted.org/packages/96/76/0f7154952f037cb320b83e1c952ec4a19d5d689cf7d27cb8a26887d7bbc1/llvmlite-0.45.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b3796b1b1e1c14dcae34285d2f4ea488402fbd2c400ccf7137603ca3800864f", size = 56288211, upload-time = "2025-10-01T18:01:24.079Z" },
+ { url = "https://files.pythonhosted.org/packages/00/b1/0b581942be2683ceb6862d558979e87387e14ad65a1e4db0e7dd671fa315/llvmlite-0.45.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:779e2f2ceefef0f4368548685f0b4adde34e5f4b457e90391f570a10b348d433", size = 55140958, upload-time = "2025-10-01T18:02:30.482Z" },
+ { url = "https://files.pythonhosted.org/packages/33/94/9ba4ebcf4d541a325fd8098ddc073b663af75cc8b065b6059848f7d4dce7/llvmlite-0.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e6c9949baf25d9aa9cd7cf0f6d011b9ca660dd17f5ba2b23bdbdb77cc86b116", size = 38132231, upload-time = "2025-10-01T18:05:03.664Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/e2/c185bb7e88514d5025f93c6c4092f6120c6cea8fe938974ec9860fb03bbb/llvmlite-0.45.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:d9ea9e6f17569a4253515cc01dade70aba536476e3d750b2e18d81d7e670eb15", size = 43043524, upload-time = "2025-10-01T18:03:43.249Z" },
+ { url = "https://files.pythonhosted.org/packages/09/b8/b5437b9ecb2064e89ccf67dccae0d02cd38911705112dd0dcbfa9cd9a9de/llvmlite-0.45.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c9f3cadee1630ce4ac18ea38adebf2a4f57a89bd2740ce83746876797f6e0bfb", size = 37253121, upload-time = "2025-10-01T18:04:30.557Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/97/ad1a907c0173a90dd4df7228f24a3ec61058bc1a9ff8a0caec20a0cc622e/llvmlite-0.45.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:57c48bf2e1083eedbc9406fb83c4e6483017879714916fe8be8a72a9672c995a", size = 56288210, upload-time = "2025-10-01T18:01:40.26Z" },
+ { url = "https://files.pythonhosted.org/packages/32/d8/c99c8ac7a326e9735401ead3116f7685a7ec652691aeb2615aa732b1fc4a/llvmlite-0.45.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3aa3dfceda4219ae39cf18806c60eeb518c1680ff834b8b311bd784160b9ce40", size = 55140957, upload-time = "2025-10-01T18:02:46.244Z" },
+ { url = "https://files.pythonhosted.org/packages/09/56/ed35668130e32dbfad2eb37356793b0a95f23494ab5be7d9bf5cb75850ee/llvmlite-0.45.1-cp313-cp313-win_amd64.whl", hash = "sha256:080e6f8d0778a8239cd47686d402cb66eb165e421efa9391366a9b7e5810a38b", size = 38132232, upload-time = "2025-10-01T18:05:14.477Z" },
+]
+
+[[package]]
+name = "markdown"
+version = "3.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
+ { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
+ { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
+ { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
+ { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
+ { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
+ { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
+ { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "mergedeep"
+version = "1.3.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" },
+]
+
+[[package]]
+name = "mkdocs"
+version = "1.6.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "ghp-import" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mergedeep" },
+ { name = "mkdocs-get-deps" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "pyyaml" },
+ { name = "pyyaml-env-tag" },
+ { name = "watchdog" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" },
+]
+
+[[package]]
+name = "mkdocs-autorefs"
+version = "1.4.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mkdocs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" },
+]
+
+[[package]]
+name = "mkdocs-coverage"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mkdocs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ed/99/3dc73a10a97b3b2f1071051987e0653b0de16b284ab669e5060c819c2609/mkdocs_coverage-2.0.0.tar.gz", hash = "sha256:628568ae5364eec06581bd6d7d83a56f9682a57350e73f07c298d5e104c7f69a", size = 31167, upload-time = "2025-09-11T12:14:05.947Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/b7/463c1c3ecc4c2e7bcb73bdc348ab356553ded0e39d25e6f1eee9c6f9c431/mkdocs_coverage-2.0.0-py3-none-any.whl", hash = "sha256:7df7449811ecea1802d42344d925a34eac9a084f22d3140bae234fad8cefa1ad", size = 6890, upload-time = "2025-09-11T12:14:03.7Z" },
+]
+
+[[package]]
+name = "mkdocs-get-deps"
+version = "0.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mergedeep" },
+ { name = "platformdirs" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" },
+]
+
+[[package]]
+name = "mkdocs-material"
+version = "9.6.22"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "babel" },
+ { name = "backrefs" },
+ { name = "colorama" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "mkdocs" },
+ { name = "mkdocs-material-extensions" },
+ { name = "paginate" },
+ { name = "pygments" },
+ { name = "pymdown-extensions" },
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5f/5d/317e37b6c43325cb376a1d6439df9cc743b8ee41c84603c2faf7286afc82/mkdocs_material-9.6.22.tar.gz", hash = "sha256:87c158b0642e1ada6da0cbd798a3389b0bc5516b90e5ece4a0fb939f00bacd1c", size = 4044968, upload-time = "2025-10-15T09:21:15.409Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/82/6fdb9a7a04fb222f4849ffec1006f891a0280825a20314d11f3ccdee14eb/mkdocs_material-9.6.22-py3-none-any.whl", hash = "sha256:14ac5f72d38898b2f98ac75a5531aaca9366eaa427b0f49fc2ecf04d99b7ad84", size = 9206252, upload-time = "2025-10-15T09:21:12.175Z" },
+]
+
+[[package]]
+name = "mkdocs-material-extensions"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" },
+]
+
+[[package]]
+name = "mkdocstrings"
+version = "0.30.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mkdocs" },
+ { name = "mkdocs-autorefs" },
+ { name = "pymdown-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350, upload-time = "2025-09-19T10:49:26.446Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704, upload-time = "2025-09-19T10:49:24.805Z" },
+]
+
+[package.optional-dependencies]
+python = [
+ { name = "mkdocstrings-python" },
+]
+
+[[package]]
+name = "mkdocstrings-python"
+version = "1.18.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "griffe" },
+ { name = "mkdocs-autorefs" },
+ { name = "mkdocstrings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972, upload-time = "2025-08-28T16:11:19.847Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215, upload-time = "2025-08-28T16:11:18.176Z" },
+]
+
+[[package]]
+name = "more-itertools"
+version = "10.8.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" },
+]
+
+[[package]]
+name = "mpmath"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
+]
+
+[[package]]
+name = "mypy"
+version = "1.18.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mypy-extensions" },
+ { name = "pathspec" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/87/cafd3ae563f88f94eec33f35ff722d043e09832ea8530ef149ec1efbaf08/mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f", size = 12731198, upload-time = "2025-09-19T00:09:44.857Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/e0/1e96c3d4266a06d4b0197ace5356d67d937d8358e2ee3ffac71faa843724/mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341", size = 11817879, upload-time = "2025-09-19T00:09:47.131Z" },
+ { url = "https://files.pythonhosted.org/packages/72/ef/0c9ba89eb03453e76bdac5a78b08260a848c7bfc5d6603634774d9cd9525/mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d", size = 12427292, upload-time = "2025-09-19T00:10:22.472Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/52/ec4a061dd599eb8179d5411d99775bec2a20542505988f40fc2fee781068/mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86", size = 13163750, upload-time = "2025-09-19T00:09:51.472Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5f/2cf2ceb3b36372d51568f2208c021870fe7834cf3186b653ac6446511839/mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37", size = 13351827, upload-time = "2025-09-19T00:09:58.311Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/7d/2697b930179e7277529eaaec1513f8de622818696857f689e4a5432e5e27/mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8", size = 9757983, upload-time = "2025-09-19T00:10:09.071Z" },
+ { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" },
+ { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" },
+ { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" },
+ { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" },
+ { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" },
+ { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" },
+ { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" },
+ { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" },
+ { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" },
+ { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
+]
+
+[[package]]
+name = "networkx"
+version = "3.5"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" },
+]
+
+[[package]]
+name = "nodeenv"
+version = "1.9.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" },
+]
+
+[[package]]
+name = "numba"
+version = "0.62.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "llvmlite" },
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/20/33dbdbfe60e5fd8e3dbfde299d106279a33d9f8308346022316781368591/numba-0.62.1.tar.gz", hash = "sha256:7b774242aa890e34c21200a1fc62e5b5757d5286267e71103257f4e2af0d5161", size = 2749817, upload-time = "2025-09-29T10:46:31.551Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dd/5f/8b3491dd849474f55e33c16ef55678ace1455c490555337899c35826836c/numba-0.62.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:f43e24b057714e480fe44bc6031de499e7cf8150c63eb461192caa6cc8530bc8", size = 2684279, upload-time = "2025-09-29T10:43:37.213Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/18/71969149bfeb65a629e652b752b80167fe8a6a6f6e084f1f2060801f7f31/numba-0.62.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:57cbddc53b9ee02830b828a8428757f5c218831ccc96490a314ef569d8342b7b", size = 2687330, upload-time = "2025-09-29T10:43:59.601Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/7d/403be3fecae33088027bc8a95dc80a2fda1e3beff3e0e5fc4374ada3afbe/numba-0.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:604059730c637c7885386521bb1b0ddcbc91fd56131a6dcc54163d6f1804c872", size = 3739727, upload-time = "2025-09-29T10:42:45.922Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/c3/3d910d08b659a6d4c62ab3cd8cd93c4d8b7709f55afa0d79a87413027ff6/numba-0.62.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6c540880170bee817011757dc9049dba5a29db0c09b4d2349295991fe3ee55f", size = 3445490, upload-time = "2025-09-29T10:43:12.692Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/82/9d425c2f20d9f0a37f7cb955945a553a00fa06a2b025856c3550227c5543/numba-0.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:03de6d691d6b6e2b76660ba0f38f37b81ece8b2cc524a62f2a0cfae2bfb6f9da", size = 2745550, upload-time = "2025-09-29T10:44:20.571Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/fa/30fa6873e9f821c0ae755915a3ca444e6ff8d6a7b6860b669a3d33377ac7/numba-0.62.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:1b743b32f8fa5fff22e19c2e906db2f0a340782caf024477b97801b918cf0494", size = 2685346, upload-time = "2025-09-29T10:43:43.677Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/d5/504ce8dc46e0dba2790c77e6b878ee65b60fe3e7d6d0006483ef6fde5a97/numba-0.62.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90fa21b0142bcf08ad8e32a97d25d0b84b1e921bc9423f8dda07d3652860eef6", size = 2688139, upload-time = "2025-09-29T10:44:04.894Z" },
+ { url = "https://files.pythonhosted.org/packages/50/5f/6a802741176c93f2ebe97ad90751894c7b0c922b52ba99a4395e79492205/numba-0.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6ef84d0ac19f1bf80431347b6f4ce3c39b7ec13f48f233a48c01e2ec06ecbc59", size = 3796453, upload-time = "2025-09-29T10:42:52.771Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/df/efd21527d25150c4544eccc9d0b7260a5dec4b7e98b5a581990e05a133c0/numba-0.62.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9315cc5e441300e0ca07c828a627d92a6802bcbf27c5487f31ae73783c58da53", size = 3496451, upload-time = "2025-09-29T10:43:19.279Z" },
+ { url = "https://files.pythonhosted.org/packages/80/44/79bfdab12a02796bf4f1841630355c82b5a69933b1d50eb15c7fa37dabe8/numba-0.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:44e3aa6228039992f058f5ebfcfd372c83798e9464297bdad8cc79febcf7891e", size = 2745552, upload-time = "2025-09-29T10:44:26.399Z" },
+ { url = "https://files.pythonhosted.org/packages/22/76/501ea2c07c089ef1386868f33dff2978f43f51b854e34397b20fc55e0a58/numba-0.62.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:b72489ba8411cc9fdcaa2458d8f7677751e94f0109eeb53e5becfdc818c64afb", size = 2685766, upload-time = "2025-09-29T10:43:49.161Z" },
+ { url = "https://files.pythonhosted.org/packages/80/68/444986ed95350c0611d5c7b46828411c222ce41a0c76707c36425d27ce29/numba-0.62.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:44a1412095534a26fb5da2717bc755b57da5f3053965128fe3dc286652cc6a92", size = 2688741, upload-time = "2025-09-29T10:44:10.07Z" },
+ { url = "https://files.pythonhosted.org/packages/78/7e/bf2e3634993d57f95305c7cee4c9c6cb3c9c78404ee7b49569a0dfecfe33/numba-0.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c9460b9e936c5bd2f0570e20a0a5909ee6e8b694fd958b210e3bde3a6dba2d7", size = 3804576, upload-time = "2025-09-29T10:42:59.53Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/b6/8a1723fff71f63bbb1354bdc60a1513a068acc0f5322f58da6f022d20247/numba-0.62.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:728f91a874192df22d74e3fd42c12900b7ce7190b1aad3574c6c61b08313e4c5", size = 3503367, upload-time = "2025-09-29T10:43:26.326Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/ec/9d414e7a80d6d1dc4af0e07c6bfe293ce0b04ea4d0ed6c45dad9bd6e72eb/numba-0.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:bbf3f88b461514287df66bc8d0307e949b09f2b6f67da92265094e8fa1282dd8", size = 2745529, upload-time = "2025-09-29T10:44:31.738Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.3.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7a/45/e80d203ef6b267aa29b22714fb558930b27960a0c5ce3c19c999232bb3eb/numpy-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ffc4f5caba7dfcbe944ed674b7eef683c7e94874046454bb79ed7ee0236f59d", size = 21259253, upload-time = "2025-09-09T15:56:02.094Z" },
+ { url = "https://files.pythonhosted.org/packages/52/18/cf2c648fccf339e59302e00e5f2bc87725a3ce1992f30f3f78c9044d7c43/numpy-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7e946c7170858a0295f79a60214424caac2ffdb0063d4d79cb681f9aa0aa569", size = 14450980, upload-time = "2025-09-09T15:56:05.926Z" },
+ { url = "https://files.pythonhosted.org/packages/93/fb/9af1082bec870188c42a1c239839915b74a5099c392389ff04215dcee812/numpy-2.3.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:cd4260f64bc794c3390a63bf0728220dd1a68170c169088a1e0dfa2fde1be12f", size = 5379709, upload-time = "2025-09-09T15:56:07.95Z" },
+ { url = "https://files.pythonhosted.org/packages/75/0f/bfd7abca52bcbf9a4a65abc83fe18ef01ccdeb37bfb28bbd6ad613447c79/numpy-2.3.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f0ddb4b96a87b6728df9362135e764eac3cfa674499943ebc44ce96c478ab125", size = 6913923, upload-time = "2025-09-09T15:56:09.443Z" },
+ { url = "https://files.pythonhosted.org/packages/79/55/d69adad255e87ab7afda1caf93ca997859092afeb697703e2f010f7c2e55/numpy-2.3.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afd07d377f478344ec6ca2b8d4ca08ae8bd44706763d1efb56397de606393f48", size = 14589591, upload-time = "2025-09-09T15:56:11.234Z" },
+ { url = "https://files.pythonhosted.org/packages/10/a2/010b0e27ddeacab7839957d7a8f00e91206e0c2c47abbb5f35a2630e5387/numpy-2.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc92a5dedcc53857249ca51ef29f5e5f2f8c513e22cfb90faeb20343b8c6f7a6", size = 16938714, upload-time = "2025-09-09T15:56:14.637Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/6b/12ce8ede632c7126eb2762b9e15e18e204b81725b81f35176eac14dc5b82/numpy-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7af05ed4dc19f308e1d9fc759f36f21921eb7bbfc82843eeec6b2a2863a0aefa", size = 16370592, upload-time = "2025-09-09T15:56:17.285Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/35/aba8568b2593067bb6a8fe4c52babb23b4c3b9c80e1b49dff03a09925e4a/numpy-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:433bf137e338677cebdd5beac0199ac84712ad9d630b74eceeb759eaa45ddf30", size = 18884474, upload-time = "2025-09-09T15:56:20.943Z" },
+ { url = "https://files.pythonhosted.org/packages/45/fa/7f43ba10c77575e8be7b0138d107e4f44ca4a1ef322cd16980ea3e8b8222/numpy-2.3.3-cp311-cp311-win32.whl", hash = "sha256:eb63d443d7b4ffd1e873f8155260d7f58e7e4b095961b01c91062935c2491e57", size = 6599794, upload-time = "2025-09-09T15:56:23.258Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/a2/a4f78cb2241fe5664a22a10332f2be886dcdea8784c9f6a01c272da9b426/numpy-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:ec9d249840f6a565f58d8f913bccac2444235025bbb13e9a4681783572ee3caa", size = 13088104, upload-time = "2025-09-09T15:56:25.476Z" },
+ { url = "https://files.pythonhosted.org/packages/79/64/e424e975adbd38282ebcd4891661965b78783de893b381cbc4832fb9beb2/numpy-2.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:74c2a948d02f88c11a3c075d9733f1ae67d97c6bdb97f2bb542f980458b257e7", size = 10460772, upload-time = "2025-09-09T15:56:27.679Z" },
+ { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload-time = "2025-09-09T15:56:29.966Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload-time = "2025-09-09T15:56:32.175Z" },
+ { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload-time = "2025-09-09T15:56:34.175Z" },
+ { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload-time = "2025-09-09T15:56:36.149Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload-time = "2025-09-09T15:56:40.548Z" },
+ { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload-time = "2025-09-09T15:56:43.343Z" },
+ { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload-time = "2025-09-09T15:56:46.141Z" },
+ { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload-time = "2025-09-09T15:56:49.844Z" },
+ { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800, upload-time = "2025-09-09T15:56:52.499Z" },
+ { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615, upload-time = "2025-09-09T15:56:54.422Z" },
+ { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936, upload-time = "2025-09-09T15:56:56.541Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload-time = "2025-09-09T15:56:59.087Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload-time = "2025-09-09T15:57:01.73Z" },
+ { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload-time = "2025-09-09T15:57:03.765Z" },
+ { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload-time = "2025-09-09T15:57:07.921Z" },
+ { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload-time = "2025-09-09T15:57:11.349Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload-time = "2025-09-09T15:57:14.245Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload-time = "2025-09-09T15:57:16.534Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload-time = "2025-09-09T15:57:18.883Z" },
+ { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250, upload-time = "2025-09-09T15:57:21.296Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269, upload-time = "2025-09-09T15:57:23.034Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314, upload-time = "2025-09-09T15:57:25.045Z" },
+ { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload-time = "2025-09-09T15:57:27.257Z" },
+ { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload-time = "2025-09-09T15:57:30.077Z" },
+ { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload-time = "2025-09-09T15:57:32.733Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload-time = "2025-09-09T15:57:34.328Z" },
+ { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload-time = "2025-09-09T15:57:36.255Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload-time = "2025-09-09T15:57:38.622Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload-time = "2025-09-09T15:57:41.16Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload-time = "2025-09-09T15:57:43.459Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776, upload-time = "2025-09-09T15:57:45.793Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281, upload-time = "2025-09-09T15:57:47.492Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275, upload-time = "2025-09-09T15:57:49.647Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload-time = "2025-09-09T15:57:52.006Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload-time = "2025-09-09T15:57:54.407Z" },
+ { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload-time = "2025-09-09T15:57:56.5Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload-time = "2025-09-09T15:57:58.206Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload-time = "2025-09-09T15:58:00.035Z" },
+ { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload-time = "2025-09-09T15:58:02.738Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload-time = "2025-09-09T15:58:05.029Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload-time = "2025-09-09T15:58:07.745Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload-time = "2025-09-09T15:58:10.096Z" },
+ { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload-time = "2025-09-09T15:58:12.138Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload-time = "2025-09-09T15:58:14.64Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload-time = "2025-09-09T15:58:16.889Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload-time = "2025-09-09T15:58:20.343Z" },
+ { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload-time = "2025-09-09T15:58:22.481Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload-time = "2025-09-09T15:58:24.569Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload-time = "2025-09-09T15:58:26.416Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload-time = "2025-09-09T15:58:28.831Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload-time = "2025-09-09T15:58:31.349Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload-time = "2025-09-09T15:58:33.762Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload-time = "2025-09-09T15:58:36.04Z" },
+ { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload-time = "2025-09-09T15:58:37.927Z" },
+ { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload-time = "2025-09-09T15:58:40.576Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/f2/7e0a37cfced2644c9563c529f29fa28acbd0960dde32ece683aafa6f4949/numpy-2.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1e02c7159791cd481e1e6d5ddd766b62a4d5acf8df4d4d1afe35ee9c5c33a41e", size = 21131019, upload-time = "2025-09-09T15:58:42.838Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/7e/3291f505297ed63831135a6cc0f474da0c868a1f31b0dd9a9f03a7a0d2ed/numpy-2.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:dca2d0fc80b3893ae72197b39f69d55a3cd8b17ea1b50aa4c62de82419936150", size = 14376288, upload-time = "2025-09-09T15:58:45.425Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/4b/ae02e985bdeee73d7b5abdefeb98aef1207e96d4c0621ee0cf228ddfac3c/numpy-2.3.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:99683cbe0658f8271b333a1b1b4bb3173750ad59c0c61f5bbdc5b318918fffe3", size = 5305425, upload-time = "2025-09-09T15:58:48.6Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/eb/9df215d6d7250db32007941500dc51c48190be25f2401d5b2b564e467247/numpy-2.3.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d9d537a39cc9de668e5cd0e25affb17aec17b577c6b3ae8a3d866b479fbe88d0", size = 6819053, upload-time = "2025-09-09T15:58:50.401Z" },
+ { url = "https://files.pythonhosted.org/packages/57/62/208293d7d6b2a8998a4a1f23ac758648c3c32182d4ce4346062018362e29/numpy-2.3.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8596ba2f8af5f93b01d97563832686d20206d303024777f6dfc2e7c7c3f1850e", size = 14420354, upload-time = "2025-09-09T15:58:52.704Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/0c/8e86e0ff7072e14a71b4c6af63175e40d1e7e933ce9b9e9f765a95b4e0c3/numpy-2.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1ec5615b05369925bd1125f27df33f3b6c8bc10d788d5999ecd8769a1fa04db", size = 16760413, upload-time = "2025-09-09T15:58:55.027Z" },
+ { url = "https://files.pythonhosted.org/packages/af/11/0cc63f9f321ccf63886ac203336777140011fb669e739da36d8db3c53b98/numpy-2.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2e267c7da5bf7309670523896df97f93f6e469fb931161f483cd6882b3b1a5dc", size = 12971844, upload-time = "2025-09-09T15:58:57.359Z" },
+]
+
+[[package]]
+name = "nvidia-cublas-cu12"
+version = "12.8.4.1"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" },
+]
+
+[[package]]
+name = "nvidia-cuda-cupti-cu12"
+version = "12.8.90"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" },
+]
+
+[[package]]
+name = "nvidia-cuda-nvrtc-cu12"
+version = "12.8.93"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" },
+]
+
+[[package]]
+name = "nvidia-cuda-runtime-cu12"
+version = "12.8.90"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" },
+]
+
+[[package]]
+name = "nvidia-cudnn-cu12"
+version = "9.10.2.21"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "nvidia-cublas-cu12" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" },
+]
+
+[[package]]
+name = "nvidia-cufft-cu12"
+version = "11.3.3.83"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "nvidia-nvjitlink-cu12" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" },
+]
+
+[[package]]
+name = "nvidia-cufile-cu12"
+version = "1.13.1.3"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" },
+]
+
+[[package]]
+name = "nvidia-curand-cu12"
+version = "10.3.9.90"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" },
+]
+
+[[package]]
+name = "nvidia-cusolver-cu12"
+version = "11.7.3.90"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "nvidia-cublas-cu12" },
+ { name = "nvidia-cusparse-cu12" },
+ { name = "nvidia-nvjitlink-cu12" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" },
+]
+
+[[package]]
+name = "nvidia-cusparse-cu12"
+version = "12.5.8.93"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "nvidia-nvjitlink-cu12" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" },
+]
+
+[[package]]
+name = "nvidia-cusparselt-cu12"
+version = "0.7.1"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" },
+]
+
+[[package]]
+name = "nvidia-nccl-cu12"
+version = "2.27.3"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5c/5b/4e4fff7bad39adf89f735f2bc87248c81db71205b62bcc0d5ca5b606b3c3/nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039", size = 322364134, upload-time = "2025-06-03T21:58:04.013Z" },
+]
+
+[[package]]
+name = "nvidia-nvjitlink-cu12"
+version = "12.8.93"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" },
+]
+
+[[package]]
+name = "nvidia-nvtx-cu12"
+version = "12.8.90"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" },
+]
+
+[[package]]
+name = "openai-whisper"
+version = "20250625"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "more-itertools" },
+ { name = "numba" },
+ { name = "numpy" },
+ { name = "tiktoken" },
+ { name = "torch" },
+ { name = "tqdm" },
+ { name = "triton", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or sys_platform == 'linux2'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/35/8e/d36f8880bcf18ec026a55807d02fe4c7357da9f25aebd92f85178000c0dc/openai_whisper-20250625.tar.gz", hash = "sha256:37a91a3921809d9f44748ffc73c0a55c9f366c85a3ef5c2ae0cc09540432eb96", size = 803191, upload-time = "2025-06-26T01:06:13.34Z" }
+
+[[package]]
+name = "packaging"
+version = "25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
+]
+
+[[package]]
+name = "paginate"
+version = "0.5.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" },
+]
+
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
+]
+
+[[package]]
+name = "pip"
+version = "25.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/6e/74a3f0179a4a73a53d66ce57fdb4de0080a8baa1de0063de206d6167acc2/pip-25.3.tar.gz", hash = "sha256:8d0538dbbd7babbd207f261ed969c65de439f6bc9e5dbd3b3b9a77f25d95f343", size = 1803014, upload-time = "2025-10-25T00:55:41.394Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl", hash = "sha256:9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd", size = 1778622, upload-time = "2025-10-25T00:55:39.247Z" },
+]
+
+[[package]]
+name = "pip-review"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+ { name = "pip" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f7/e8/bcb143f21668de2c285ce3d73041ba035b2340fb44bdd95ee04b3e313d09/pip-review-1.3.0.tar.gz", hash = "sha256:886fc48503a6ec99851036f30a6be07ce7e4610d1491786affecb7a364eddeda", size = 6644, upload-time = "2022-11-29T16:45:35.122Z" }
+
+[[package]]
+name = "platformdirs"
+version = "4.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pprintpp"
+version = "0.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/06/1a/7737e7a0774da3c3824d654993cf57adc915cb04660212f03406334d8c0b/pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403", size = 17995, upload-time = "2018-07-01T01:42:34.87Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4e/d1/e4ed95fdd3ef13b78630280d9e9e240aeb65cc7c544ec57106149c3942fb/pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d", size = 16952, upload-time = "2018-07-01T01:42:36.496Z" },
+]
+
+[[package]]
+name = "pre-commit"
+version = "4.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cfgv" },
+ { name = "identify" },
+ { name = "nodeenv" },
+ { name = "pyyaml" },
+ { name = "virtualenv" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" },
+]
+
+[[package]]
+name = "pydub"
+version = "0.25.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326, upload-time = "2021-03-10T02:09:54.659Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" },
+]
+
+[[package]]
+name = "pyfakefs"
+version = "5.9.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9b/66/a90124bc9f0d2335897a7d077941f12eaa06c851c8d1b1f37967424d7aa8/pyfakefs-5.9.3.tar.gz", hash = "sha256:b458b11abc8862d4d8500816170a9b25e10d07437332b9dffd651069f3d4c40c", size = 229964, upload-time = "2025-08-29T18:34:21.032Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/61/d2b795a4d19713a2312d54b0c001002441f71188d6a3e11e43ddfa03bb1b/pyfakefs-5.9.3-py3-none-any.whl", hash = "sha256:14a0514e94ff156543208c0b4832facc68bdf19de993799b67d58dd5ca05ef30", size = 245197, upload-time = "2025-08-29T18:34:19.112Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
+]
+
+[[package]]
+name = "pymdown-extensions"
+version = "10.16.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" },
+]
+
+[[package]]
+name = "pyproject-api"
+version = "1.10.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/45/7b/c0e1333b61d41c69e59e5366e727b18c4992688caf0de1be10b3e5265f6b/pyproject_api-1.10.0.tar.gz", hash = "sha256:40c6f2d82eebdc4afee61c773ed208c04c19db4c4a60d97f8d7be3ebc0bbb330", size = 22785, upload-time = "2025-10-09T19:12:27.21Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl", hash = "sha256:8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09", size = 13218, upload-time = "2025-10-09T19:12:24.428Z" },
+]
+
+[[package]]
+name = "pysonar"
+version = "1.2.0.2419"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jproperties" },
+ { name = "pyfakefs" },
+ { name = "requests" },
+ { name = "responses" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a7/b1/4b408bc6abfc804f1bbb14f76a78128d5abde0e27433d358df1c2fbcdfc7/pysonar-1.2.0.2419.tar.gz", hash = "sha256:3b48f24bc520c930981fb19979bc39e02fee707bdc3bb39292f517e0a805ba94", size = 26409, upload-time = "2025-09-15T14:47:55.687Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/a0/6a0e78854900d6c4474b37fe645d68794899b2f8b008a44ce1226c634548/pysonar-1.2.0.2419-py3-none-any.whl", hash = "sha256:a9b8cf858b11709b68d82c4a9395dd8381378eab93497d44ed08aeeb54cb7447", size = 39522, upload-time = "2025-09-15T14:47:54.734Z" },
+]
+
+[[package]]
+name = "pysrt"
+version = "1.1.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "chardet" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/31/1a/0d858da1c6622dcf16011235a2639b0a01a49cecf812f8ab03308ab4de37/pysrt-1.1.2.tar.gz", hash = "sha256:b4f844ba33e4e7743e9db746492f3a193dc0bc112b153914698e7c1cdeb9b0b9", size = 104371, upload-time = "2020-01-20T15:22:28.291Z" }
+
+[[package]]
+name = "pytest"
+version = "8.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
+]
+
+[[package]]
+name = "pytest-clarity"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pprintpp" },
+ { name = "pytest" },
+ { name = "rich" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/52/5c/cafa97944de55738a6a2c5a7cee00d073cb80495032d2b112c4546525eca/pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772", size = 4891, upload-time = "2021-06-11T18:16:18.372Z" }
+
+[[package]]
+name = "pytest-cov"
+version = "7.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "coverage", extra = ["toml"] },
+ { name = "pluggy" },
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" },
+]
+
+[[package]]
+name = "pytest-mock"
+version = "3.15.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" },
+]
+
+[[package]]
+name = "pytest-sugar"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+ { name = "termcolor" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0b/4e/60fed105549297ba1a700e1ea7b828044842ea27d72c898990510b79b0e2/pytest-sugar-1.1.1.tar.gz", hash = "sha256:73b8b65163ebf10f9f671efab9eed3d56f20d2ca68bda83fa64740a92c08f65d", size = 16533, upload-time = "2025-08-23T12:19:35.737Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/d5/81d38a91c1fdafb6711f053f5a9b92ff788013b19821257c2c38c1e132df/pytest_sugar-1.1.1-py3-none-any.whl", hash = "sha256:2f8319b907548d5b9d03a171515c1d43d2e38e32bd8182a1781eb20b43344cc8", size = 11440, upload-time = "2025-08-23T12:19:34.894Z" },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" },
+ { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" },
+ { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" },
+ { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" },
+ { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" },
+ { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
+]
+
+[[package]]
+name = "pyyaml-env-tag"
+version = "1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" },
+]
+
+[[package]]
+name = "regex"
+version = "2025.9.18"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/49/d3/eaa0d28aba6ad1827ad1e716d9a93e1ba963ada61887498297d3da715133/regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4", size = 400917, upload-time = "2025-09-19T00:38:35.79Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/58/61/80eda662fc4eb32bfedc331f42390974c9e89c7eac1b79cd9eea4d7c458c/regex-2025.9.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:51076980cd08cd13c88eb7365427ae27f0d94e7cebe9ceb2bb9ffdae8fc4d82a", size = 484832, upload-time = "2025-09-19T00:35:30.011Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/d9/33833d9abddf3f07ad48504ddb53fe3b22f353214bbb878a72eee1e3ddbf/regex-2025.9.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:828446870bd7dee4e0cbeed767f07961aa07f0ea3129f38b3ccecebc9742e0b8", size = 288994, upload-time = "2025-09-19T00:35:31.733Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/b3/526ee96b0d70ea81980cbc20c3496fa582f775a52e001e2743cc33b2fa75/regex-2025.9.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28821d5637866479ec4cc23b8c990f5bc6dd24e5e4384ba4a11d38a526e1414", size = 286619, upload-time = "2025-09-19T00:35:33.221Z" },
+ { url = "https://files.pythonhosted.org/packages/65/4f/c2c096b02a351b33442aed5895cdd8bf87d372498d2100927c5a053d7ba3/regex-2025.9.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726177ade8e481db669e76bf99de0b278783be8acd11cef71165327abd1f170a", size = 792454, upload-time = "2025-09-19T00:35:35.361Z" },
+ { url = "https://files.pythonhosted.org/packages/24/15/b562c9d6e47c403c4b5deb744f8b4bf6e40684cf866c7b077960a925bdff/regex-2025.9.18-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5cca697da89b9f8ea44115ce3130f6c54c22f541943ac8e9900461edc2b8bd4", size = 858723, upload-time = "2025-09-19T00:35:36.949Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/01/dba305409849e85b8a1a681eac4c03ed327d8de37895ddf9dc137f59c140/regex-2025.9.18-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dfbde38f38004703c35666a1e1c088b778e35d55348da2b7b278914491698d6a", size = 905899, upload-time = "2025-09-19T00:35:38.723Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/d0/c51d1e6a80eab11ef96a4cbad17fc0310cf68994fb01a7283276b7e5bbd6/regex-2025.9.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2f422214a03fab16bfa495cfec72bee4aaa5731843b771860a471282f1bf74f", size = 798981, upload-time = "2025-09-19T00:35:40.416Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5e/72db90970887bbe02296612bd61b0fa31e6d88aa24f6a4853db3e96c575e/regex-2025.9.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a295916890f4df0902e4286bc7223ee7f9e925daa6dcdec4192364255b70561a", size = 781900, upload-time = "2025-09-19T00:35:42.077Z" },
+ { url = "https://files.pythonhosted.org/packages/50/ff/596be45eea8e9bc31677fde243fa2904d00aad1b32c31bce26c3dbba0b9e/regex-2025.9.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5db95ff632dbabc8c38c4e82bf545ab78d902e81160e6e455598014f0abe66b9", size = 852952, upload-time = "2025-09-19T00:35:43.751Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/1b/2dfa348fa551e900ed3f5f63f74185b6a08e8a76bc62bc9c106f4f92668b/regex-2025.9.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb967eb441b0f15ae610b7069bdb760b929f267efbf522e814bbbfffdf125ce2", size = 844355, upload-time = "2025-09-19T00:35:45.309Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/bf/aefb1def27fe33b8cbbb19c75c13aefccfbef1c6686f8e7f7095705969c7/regex-2025.9.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f04d2f20da4053d96c08f7fde6e1419b7ec9dbcee89c96e3d731fca77f411b95", size = 787254, upload-time = "2025-09-19T00:35:46.904Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/4e/8ef042e7cf0dbbb401e784e896acfc1b367b95dfbfc9ada94c2ed55a081f/regex-2025.9.18-cp311-cp311-win32.whl", hash = "sha256:895197241fccf18c0cea7550c80e75f185b8bd55b6924fcae269a1a92c614a07", size = 264129, upload-time = "2025-09-19T00:35:48.597Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/7d/c4fcabf80dcdd6821c0578ad9b451f8640b9110fb3dcb74793dd077069ff/regex-2025.9.18-cp311-cp311-win_amd64.whl", hash = "sha256:7e2b414deae99166e22c005e154a5513ac31493db178d8aec92b3269c9cce8c9", size = 276160, upload-time = "2025-09-19T00:36:00.45Z" },
+ { url = "https://files.pythonhosted.org/packages/64/f8/0e13c8ae4d6df9d128afaba138342d532283d53a4c1e7a8c93d6756c8f4a/regex-2025.9.18-cp311-cp311-win_arm64.whl", hash = "sha256:fb137ec7c5c54f34a25ff9b31f6b7b0c2757be80176435bf367111e3f71d72df", size = 268471, upload-time = "2025-09-19T00:36:02.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/99/05859d87a66ae7098222d65748f11ef7f2dff51bfd7482a4e2256c90d72b/regex-2025.9.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:436e1b31d7efd4dcd52091d076482031c611dde58bf9c46ca6d0a26e33053a7e", size = 486335, upload-time = "2025-09-19T00:36:03.661Z" },
+ { url = "https://files.pythonhosted.org/packages/97/7e/d43d4e8b978890932cf7b0957fce58c5b08c66f32698f695b0c2c24a48bf/regex-2025.9.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c190af81e5576b9c5fdc708f781a52ff20f8b96386c6e2e0557a78402b029f4a", size = 289720, upload-time = "2025-09-19T00:36:05.471Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/3b/ff80886089eb5dcf7e0d2040d9aaed539e25a94300403814bb24cc775058/regex-2025.9.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4121f1ce2b2b5eec4b397cc1b277686e577e658d8f5870b7eb2d726bd2300ab", size = 287257, upload-time = "2025-09-19T00:36:07.072Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/66/243edf49dd8720cba8d5245dd4d6adcb03a1defab7238598c0c97cf549b8/regex-2025.9.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:300e25dbbf8299d87205e821a201057f2ef9aa3deb29caa01cd2cac669e508d5", size = 797463, upload-time = "2025-09-19T00:36:08.399Z" },
+ { url = "https://files.pythonhosted.org/packages/df/71/c9d25a1142c70432e68bb03211d4a82299cd1c1fbc41db9409a394374ef5/regex-2025.9.18-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b47fcf9f5316c0bdaf449e879407e1b9937a23c3b369135ca94ebc8d74b1742", size = 862670, upload-time = "2025-09-19T00:36:10.101Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/8f/329b1efc3a64375a294e3a92d43372bf1a351aa418e83c21f2f01cf6ec41/regex-2025.9.18-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:57a161bd3acaa4b513220b49949b07e252165e6b6dc910ee7617a37ff4f5b425", size = 910881, upload-time = "2025-09-19T00:36:12.223Z" },
+ { url = "https://files.pythonhosted.org/packages/35/9e/a91b50332a9750519320ed30ec378b74c996f6befe282cfa6bb6cea7e9fd/regex-2025.9.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f130c3a7845ba42de42f380fff3c8aebe89a810747d91bcf56d40a069f15352", size = 802011, upload-time = "2025-09-19T00:36:13.901Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/1d/6be3b8d7856b6e0d7ee7f942f437d0a76e0d5622983abbb6d21e21ab9a17/regex-2025.9.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f96fa342b6f54dcba928dd452e8d8cb9f0d63e711d1721cd765bb9f73bb048d", size = 786668, upload-time = "2025-09-19T00:36:15.391Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/ce/4a60e53df58bd157c5156a1736d3636f9910bdcc271d067b32b7fcd0c3a8/regex-2025.9.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f0d676522d68c207828dcd01fb6f214f63f238c283d9f01d85fc664c7c85b56", size = 856578, upload-time = "2025-09-19T00:36:16.845Z" },
+ { url = "https://files.pythonhosted.org/packages/86/e8/162c91bfe7217253afccde112868afb239f94703de6580fb235058d506a6/regex-2025.9.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:40532bff8a1a0621e7903ae57fce88feb2e8a9a9116d341701302c9302aef06e", size = 849017, upload-time = "2025-09-19T00:36:18.597Z" },
+ { url = "https://files.pythonhosted.org/packages/35/34/42b165bc45289646ea0959a1bc7531733e90b47c56a72067adfe6b3251f6/regex-2025.9.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:039f11b618ce8d71a1c364fdee37da1012f5a3e79b1b2819a9f389cd82fd6282", size = 788150, upload-time = "2025-09-19T00:36:20.464Z" },
+ { url = "https://files.pythonhosted.org/packages/79/5d/cdd13b1f3c53afa7191593a7ad2ee24092a5a46417725ffff7f64be8342d/regex-2025.9.18-cp312-cp312-win32.whl", hash = "sha256:e1dd06f981eb226edf87c55d523131ade7285137fbde837c34dc9d1bf309f459", size = 264536, upload-time = "2025-09-19T00:36:21.922Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/f5/4a7770c9a522e7d2dc1fa3ffc83ab2ab33b0b22b447e62cffef186805302/regex-2025.9.18-cp312-cp312-win_amd64.whl", hash = "sha256:3d86b5247bf25fa3715e385aa9ff272c307e0636ce0c9595f64568b41f0a9c77", size = 275501, upload-time = "2025-09-19T00:36:23.4Z" },
+ { url = "https://files.pythonhosted.org/packages/df/05/9ce3e110e70d225ecbed455b966003a3afda5e58e8aec2964042363a18f4/regex-2025.9.18-cp312-cp312-win_arm64.whl", hash = "sha256:032720248cbeeae6444c269b78cb15664458b7bb9ed02401d3da59fe4d68c3a5", size = 268601, upload-time = "2025-09-19T00:36:25.092Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/c7/5c48206a60ce33711cf7dcaeaed10dd737733a3569dc7e1dce324dd48f30/regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2", size = 485955, upload-time = "2025-09-19T00:36:26.822Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/be/74fc6bb19a3c491ec1ace943e622b5a8539068771e8705e469b2da2306a7/regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb", size = 289583, upload-time = "2025-09-19T00:36:28.577Z" },
+ { url = "https://files.pythonhosted.org/packages/25/c4/9ceaa433cb5dc515765560f22a19578b95b92ff12526e5a259321c4fc1a0/regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af", size = 287000, upload-time = "2025-09-19T00:36:30.161Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/e6/68bc9393cb4dc68018456568c048ac035854b042bc7c33cb9b99b0680afa/regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29", size = 797535, upload-time = "2025-09-19T00:36:31.876Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/1c/ebae9032d34b78ecfe9bd4b5e6575b55351dc8513485bb92326613732b8c/regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f", size = 862603, upload-time = "2025-09-19T00:36:33.344Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/74/12332c54b3882557a4bcd2b99f8be581f5c6a43cf1660a85b460dd8ff468/regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68", size = 910829, upload-time = "2025-09-19T00:36:34.826Z" },
+ { url = "https://files.pythonhosted.org/packages/86/70/ba42d5ed606ee275f2465bfc0e2208755b06cdabd0f4c7c4b614d51b57ab/regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783", size = 802059, upload-time = "2025-09-19T00:36:36.664Z" },
+ { url = "https://files.pythonhosted.org/packages/da/c5/fcb017e56396a7f2f8357412638d7e2963440b131a3ca549be25774b3641/regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac", size = 786781, upload-time = "2025-09-19T00:36:38.168Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/ee/21c4278b973f630adfb3bcb23d09d83625f3ab1ca6e40ebdffe69901c7a1/regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e", size = 856578, upload-time = "2025-09-19T00:36:40.129Z" },
+ { url = "https://files.pythonhosted.org/packages/87/0b/de51550dc7274324435c8f1539373ac63019b0525ad720132866fff4a16a/regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23", size = 849119, upload-time = "2025-09-19T00:36:41.651Z" },
+ { url = "https://files.pythonhosted.org/packages/60/52/383d3044fc5154d9ffe4321696ee5b2ee4833a28c29b137c22c33f41885b/regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f", size = 788219, upload-time = "2025-09-19T00:36:43.575Z" },
+ { url = "https://files.pythonhosted.org/packages/20/bd/2614fc302671b7359972ea212f0e3a92df4414aaeacab054a8ce80a86073/regex-2025.9.18-cp313-cp313-win32.whl", hash = "sha256:3810a65675845c3bdfa58c3c7d88624356dd6ee2fc186628295e0969005f928d", size = 264517, upload-time = "2025-09-19T00:36:45.503Z" },
+ { url = "https://files.pythonhosted.org/packages/07/0f/ab5c1581e6563a7bffdc1974fb2d25f05689b88e2d416525271f232b1946/regex-2025.9.18-cp313-cp313-win_amd64.whl", hash = "sha256:16eaf74b3c4180ede88f620f299e474913ab6924d5c4b89b3833bc2345d83b3d", size = 275481, upload-time = "2025-09-19T00:36:46.965Z" },
+ { url = "https://files.pythonhosted.org/packages/49/22/ee47672bc7958f8c5667a587c2600a4fba8b6bab6e86bd6d3e2b5f7cac42/regex-2025.9.18-cp313-cp313-win_arm64.whl", hash = "sha256:4dc98ba7dd66bd1261927a9f49bd5ee2bcb3660f7962f1ec02617280fc00f5eb", size = 268598, upload-time = "2025-09-19T00:36:48.314Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/83/6887e16a187c6226cb85d8301e47d3b73ecc4505a3a13d8da2096b44fd76/regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2", size = 489765, upload-time = "2025-09-19T00:36:49.996Z" },
+ { url = "https://files.pythonhosted.org/packages/51/c5/e2f7325301ea2916ff301c8d963ba66b1b2c1b06694191df80a9c4fea5d0/regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3", size = 291228, upload-time = "2025-09-19T00:36:51.654Z" },
+ { url = "https://files.pythonhosted.org/packages/91/60/7d229d2bc6961289e864a3a3cfebf7d0d250e2e65323a8952cbb7e22d824/regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12", size = 289270, upload-time = "2025-09-19T00:36:53.118Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/d7/b4f06868ee2958ff6430df89857fbf3d43014bbf35538b6ec96c2704e15d/regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0", size = 806326, upload-time = "2025-09-19T00:36:54.631Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/e4/bca99034a8f1b9b62ccf337402a8e5b959dd5ba0e5e5b2ead70273df3277/regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6", size = 871556, upload-time = "2025-09-19T00:36:56.208Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/df/e06ffaf078a162f6dd6b101a5ea9b44696dca860a48136b3ae4a9caf25e2/regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef", size = 913817, upload-time = "2025-09-19T00:36:57.807Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/05/25b05480b63292fd8e84800b1648e160ca778127b8d2367a0a258fa2e225/regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a", size = 811055, upload-time = "2025-09-19T00:36:59.762Z" },
+ { url = "https://files.pythonhosted.org/packages/70/97/7bc7574655eb651ba3a916ed4b1be6798ae97af30104f655d8efd0cab24b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d", size = 794534, upload-time = "2025-09-19T00:37:01.405Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/c2/d5da49166a52dda879855ecdba0117f073583db2b39bb47ce9a3378a8e9e/regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368", size = 866684, upload-time = "2025-09-19T00:37:03.441Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/2d/0a5c4e6ec417de56b89ff4418ecc72f7e3feca806824c75ad0bbdae0516b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90", size = 853282, upload-time = "2025-09-19T00:37:04.985Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/8e/d656af63e31a86572ec829665d6fa06eae7e144771e0330650a8bb865635/regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7", size = 797830, upload-time = "2025-09-19T00:37:06.697Z" },
+ { url = "https://files.pythonhosted.org/packages/db/ce/06edc89df8f7b83ffd321b6071be4c54dc7332c0f77860edc40ce57d757b/regex-2025.9.18-cp313-cp313t-win32.whl", hash = "sha256:168be0d2f9b9d13076940b1ed774f98595b4e3c7fc54584bba81b3cc4181742e", size = 267281, upload-time = "2025-09-19T00:37:08.568Z" },
+ { url = "https://files.pythonhosted.org/packages/83/9a/2b5d9c8b307a451fd17068719d971d3634ca29864b89ed5c18e499446d4a/regex-2025.9.18-cp313-cp313t-win_amd64.whl", hash = "sha256:d59ecf3bb549e491c8104fea7313f3563c7b048e01287db0a90485734a70a730", size = 278724, upload-time = "2025-09-19T00:37:10.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/70/177d31e8089a278a764f8ec9a3faac8d14a312d622a47385d4b43905806f/regex-2025.9.18-cp313-cp313t-win_arm64.whl", hash = "sha256:dbef80defe9fb21310948a2595420b36c6d641d9bea4c991175829b2cc4bc06a", size = 269771, upload-time = "2025-09-19T00:37:13.041Z" },
+ { url = "https://files.pythonhosted.org/packages/44/b7/3b4663aa3b4af16819f2ab6a78c4111c7e9b066725d8107753c2257448a5/regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129", size = 486130, upload-time = "2025-09-19T00:37:14.527Z" },
+ { url = "https://files.pythonhosted.org/packages/80/5b/4533f5d7ac9c6a02a4725fe8883de2aebc713e67e842c04cf02626afb747/regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea", size = 289539, upload-time = "2025-09-19T00:37:16.356Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/8d/5ab6797c2750985f79e9995fad3254caa4520846580f266ae3b56d1cae58/regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1", size = 287233, upload-time = "2025-09-19T00:37:18.025Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/1e/95afcb02ba8d3a64e6ffeb801718ce73471ad6440c55d993f65a4a5e7a92/regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47", size = 797876, upload-time = "2025-09-19T00:37:19.609Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/fb/720b1f49cec1f3b5a9fea5b34cd22b88b5ebccc8c1b5de9cc6f65eed165a/regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379", size = 863385, upload-time = "2025-09-19T00:37:21.65Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/ca/e0d07ecf701e1616f015a720dc13b84c582024cbfbb3fc5394ae204adbd7/regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203", size = 910220, upload-time = "2025-09-19T00:37:23.723Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/45/bba86413b910b708eca705a5af62163d5d396d5f647ed9485580c7025209/regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164", size = 801827, upload-time = "2025-09-19T00:37:25.684Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/a6/740fbd9fcac31a1305a8eed30b44bf0f7f1e042342be0a4722c0365ecfca/regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb", size = 786843, upload-time = "2025-09-19T00:37:27.62Z" },
+ { url = "https://files.pythonhosted.org/packages/80/a7/0579e8560682645906da640c9055506465d809cb0f5415d9976f417209a6/regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743", size = 857430, upload-time = "2025-09-19T00:37:29.362Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/9b/4dc96b6c17b38900cc9fee254fc9271d0dde044e82c78c0811b58754fde5/regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282", size = 848612, upload-time = "2025-09-19T00:37:31.42Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/6a/6f659f99bebb1775e5ac81a3fb837b85897c1a4ef5acffd0ff8ffe7e67fb/regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773", size = 787967, upload-time = "2025-09-19T00:37:34.019Z" },
+ { url = "https://files.pythonhosted.org/packages/61/35/9e35665f097c07cf384a6b90a1ac11b0b1693084a0b7a675b06f760496c6/regex-2025.9.18-cp314-cp314-win32.whl", hash = "sha256:0c3506682ea19beefe627a38872d8da65cc01ffa25ed3f2e422dffa1474f0788", size = 269847, upload-time = "2025-09-19T00:37:35.759Z" },
+ { url = "https://files.pythonhosted.org/packages/af/64/27594dbe0f1590b82de2821ebfe9a359b44dcb9b65524876cd12fabc447b/regex-2025.9.18-cp314-cp314-win_amd64.whl", hash = "sha256:57929d0f92bebb2d1a83af372cd0ffba2263f13f376e19b1e4fa32aec4efddc3", size = 278755, upload-time = "2025-09-19T00:37:37.367Z" },
+ { url = "https://files.pythonhosted.org/packages/30/a3/0cd8d0d342886bd7d7f252d701b20ae1a3c72dc7f34ef4b2d17790280a09/regex-2025.9.18-cp314-cp314-win_arm64.whl", hash = "sha256:6a4b44df31d34fa51aa5c995d3aa3c999cec4d69b9bd414a8be51984d859f06d", size = 271873, upload-time = "2025-09-19T00:37:39.125Z" },
+ { url = "https://files.pythonhosted.org/packages/99/cb/8a1ab05ecf404e18b54348e293d9b7a60ec2bd7aa59e637020c5eea852e8/regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306", size = 489773, upload-time = "2025-09-19T00:37:40.968Z" },
+ { url = "https://files.pythonhosted.org/packages/93/3b/6543c9b7f7e734d2404fa2863d0d710c907bef99d4598760ed4563d634c3/regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946", size = 291221, upload-time = "2025-09-19T00:37:42.901Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/91/e9fdee6ad6bf708d98c5d17fded423dcb0661795a49cba1b4ffb8358377a/regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f", size = 289268, upload-time = "2025-09-19T00:37:44.823Z" },
+ { url = "https://files.pythonhosted.org/packages/94/a6/bc3e8a918abe4741dadeaeb6c508e3a4ea847ff36030d820d89858f96a6c/regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95", size = 806659, upload-time = "2025-09-19T00:37:46.684Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/71/ea62dbeb55d9e6905c7b5a49f75615ea1373afcad95830047e4e310db979/regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b", size = 871701, upload-time = "2025-09-19T00:37:48.882Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/90/fbe9dedb7dad24a3a4399c0bae64bfa932ec8922a0a9acf7bc88db30b161/regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3", size = 913742, upload-time = "2025-09-19T00:37:51.015Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/1c/47e4a8c0e73d41eb9eb9fdeba3b1b810110a5139a2526e82fd29c2d9f867/regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571", size = 811117, upload-time = "2025-09-19T00:37:52.686Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/da/435f29fddfd015111523671e36d30af3342e8136a889159b05c1d9110480/regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad", size = 794647, upload-time = "2025-09-19T00:37:54.626Z" },
+ { url = "https://files.pythonhosted.org/packages/23/66/df5e6dcca25c8bc57ce404eebc7342310a0d218db739d7882c9a2b5974a3/regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494", size = 866747, upload-time = "2025-09-19T00:37:56.367Z" },
+ { url = "https://files.pythonhosted.org/packages/82/42/94392b39b531f2e469b2daa40acf454863733b674481fda17462a5ffadac/regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b", size = 853434, upload-time = "2025-09-19T00:37:58.39Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/f8/dcc64c7f7bbe58842a8f89622b50c58c3598fbbf4aad0a488d6df2c699f1/regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41", size = 798024, upload-time = "2025-09-19T00:38:00.397Z" },
+ { url = "https://files.pythonhosted.org/packages/20/8d/edf1c5d5aa98f99a692313db813ec487732946784f8f93145e0153d910e5/regex-2025.9.18-cp314-cp314t-win32.whl", hash = "sha256:2e1eddc06eeaffd249c0adb6fafc19e2118e6308c60df9db27919e96b5656096", size = 273029, upload-time = "2025-09-19T00:38:02.383Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/24/02d4e4f88466f17b145f7ea2b2c11af3a942db6222429c2c146accf16054/regex-2025.9.18-cp314-cp314t-win_amd64.whl", hash = "sha256:8620d247fb8c0683ade51217b459cb4a1081c0405a3072235ba43a40d355c09a", size = 282680, upload-time = "2025-09-19T00:38:04.102Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/a3/c64894858aaaa454caa7cc47e2f225b04d3ed08ad649eacf58d45817fad2/regex-2025.9.18-cp314-cp314t-win_arm64.whl", hash = "sha256:b7531a8ef61de2c647cdf68b3229b071e46ec326b3138b2180acb4275f470b01", size = 273034, upload-time = "2025-09-19T00:38:05.807Z" },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
+]
+
+[[package]]
+name = "requirements-parser"
+version = "0.13.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/95/96/fb6dbfebb524d5601d359a47c78fe7ba1eef90fc4096404aa60c9a906fbb/requirements_parser-0.13.0.tar.gz", hash = "sha256:0843119ca2cb2331de4eb31b10d70462e39ace698fd660a915c247d2301a4418", size = 22630, upload-time = "2025-05-21T13:42:05.464Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bd/60/50fbb6ffb35f733654466f1a90d162bcbea358adc3b0871339254fbc37b2/requirements_parser-0.13.0-py3-none-any.whl", hash = "sha256:2b3173faecf19ec5501971b7222d38f04cb45bb9d87d0ad629ca71e2e62ded14", size = 14782, upload-time = "2025-05-21T13:42:04.007Z" },
+]
+
+[[package]]
+name = "responses"
+version = "0.25.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyyaml" },
+ { name = "requests" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0e/95/89c054ad70bfef6da605338b009b2e283485835351a9935c7bfbfaca7ffc/responses-0.25.8.tar.gz", hash = "sha256:9374d047a575c8f781b94454db5cab590b6029505f488d12899ddb10a4af1cf4", size = 79320, upload-time = "2025-08-08T19:01:46.709Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1c/4c/cc276ce57e572c102d9542d383b2cfd551276581dc60004cb94fe8774c11/responses-0.25.8-py3-none-any.whl", hash = "sha256:0c710af92def29c8352ceadff0c3fe340ace27cf5af1bbe46fb71275bcd2831c", size = 34769, upload-time = "2025-08-08T19:01:45.018Z" },
+]
+
+[[package]]
+name = "rich"
+version = "14.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.14.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/34/8218a19b2055b80601e8fd201ec723c74c7fe1ca06d525a43ed07b6d8e85/ruff-0.14.2.tar.gz", hash = "sha256:98da787668f239313d9c902ca7c523fe11b8ec3f39345553a51b25abc4629c96", size = 5539663, upload-time = "2025-10-23T19:37:00.956Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/16/dd/23eb2db5ad9acae7c845700493b72d3ae214dce0b226f27df89216110f2b/ruff-0.14.2-py3-none-linux_armv6l.whl", hash = "sha256:7cbe4e593505bdec5884c2d0a4d791a90301bc23e49a6b1eb642dd85ef9c64f1", size = 12533390, upload-time = "2025-10-23T19:36:18.044Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/8c/5f9acff43ddcf3f85130d0146d0477e28ccecc495f9f684f8f7119b74c0d/ruff-0.14.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8d54b561729cee92f8d89c316ad7a3f9705533f5903b042399b6ae0ddfc62e11", size = 12887187, upload-time = "2025-10-23T19:36:22.664Z" },
+ { url = "https://files.pythonhosted.org/packages/99/fa/047646491479074029665022e9f3dc6f0515797f40a4b6014ea8474c539d/ruff-0.14.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5c8753dfa44ebb2cde10ce5b4d2ef55a41fb9d9b16732a2c5df64620dbda44a3", size = 11925177, upload-time = "2025-10-23T19:36:24.778Z" },
+ { url = "https://files.pythonhosted.org/packages/15/8b/c44cf7fe6e59ab24a9d939493a11030b503bdc2a16622cede8b7b1df0114/ruff-0.14.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d0bbeffb8d9f4fccf7b5198d566d0bad99a9cb622f1fc3467af96cb8773c9e3", size = 12358285, upload-time = "2025-10-23T19:36:26.979Z" },
+ { url = "https://files.pythonhosted.org/packages/45/01/47701b26254267ef40369aea3acb62a7b23e921c27372d127e0f3af48092/ruff-0.14.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7047f0c5a713a401e43a88d36843d9c83a19c584e63d664474675620aaa634a8", size = 12303832, upload-time = "2025-10-23T19:36:29.192Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/5c/ae7244ca4fbdf2bee9d6405dcd5bc6ae51ee1df66eb7a9884b77b8af856d/ruff-0.14.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bf8d2f9aa1602599217d82e8e0af7fd33e5878c4d98f37906b7c93f46f9a839", size = 13036995, upload-time = "2025-10-23T19:36:31.861Z" },
+ { url = "https://files.pythonhosted.org/packages/27/4c/0860a79ce6fd4c709ac01173f76f929d53f59748d0dcdd662519835dae43/ruff-0.14.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1c505b389e19c57a317cf4b42db824e2fca96ffb3d86766c1c9f8b96d32048a7", size = 14512649, upload-time = "2025-10-23T19:36:33.915Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/7f/d365de998069720a3abfc250ddd876fc4b81a403a766c74ff9bde15b5378/ruff-0.14.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a307fc45ebd887b3f26b36d9326bb70bf69b01561950cdcc6c0bdf7bb8e0f7cc", size = 14088182, upload-time = "2025-10-23T19:36:36.983Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/ea/d8e3e6b209162000a7be1faa41b0a0c16a133010311edc3329753cc6596a/ruff-0.14.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61ae91a32c853172f832c2f40bd05fd69f491db7289fb85a9b941ebdd549781a", size = 13599516, upload-time = "2025-10-23T19:36:39.208Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/ea/c7810322086db68989fb20a8d5221dd3b79e49e396b01badca07b433ab45/ruff-0.14.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1967e40286f63ee23c615e8e7e98098dedc7301568bd88991f6e544d8ae096", size = 13272690, upload-time = "2025-10-23T19:36:41.453Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/39/10b05acf8c45786ef501d454e00937e1b97964f846bf28883d1f9619928a/ruff-0.14.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2877f02119cdebf52a632d743a2e302dea422bfae152ebe2f193d3285a3a65df", size = 13496497, upload-time = "2025-10-23T19:36:43.61Z" },
+ { url = "https://files.pythonhosted.org/packages/59/a1/1f25f8301e13751c30895092485fada29076e5e14264bdacc37202e85d24/ruff-0.14.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e681c5bc777de5af898decdcb6ba3321d0d466f4cb43c3e7cc2c3b4e7b843a05", size = 12266116, upload-time = "2025-10-23T19:36:45.625Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/fa/0029bfc9ce16ae78164e6923ef392e5f173b793b26cc39aa1d8b366cf9dc/ruff-0.14.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e21be42d72e224736f0c992cdb9959a2fa53c7e943b97ef5d081e13170e3ffc5", size = 12281345, upload-time = "2025-10-23T19:36:47.618Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/ab/ece7baa3c0f29b7683be868c024f0838770c16607bea6852e46b202f1ff6/ruff-0.14.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b8264016f6f209fac16262882dbebf3f8be1629777cf0f37e7aff071b3e9b92e", size = 12629296, upload-time = "2025-10-23T19:36:49.789Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/7f/638f54b43f3d4e48c6a68062794e5b367ddac778051806b9e235dfb7aa81/ruff-0.14.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5ca36b4cb4db3067a3b24444463ceea5565ea78b95fe9a07ca7cb7fd16948770", size = 13371610, upload-time = "2025-10-23T19:36:51.882Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/35/3654a973ebe5b32e1fd4a08ed2d46755af7267da7ac710d97420d7b8657d/ruff-0.14.2-py3-none-win32.whl", hash = "sha256:41775927d287685e08f48d8eb3f765625ab0b7042cc9377e20e64f4eb0056ee9", size = 12415318, upload-time = "2025-10-23T19:36:53.961Z" },
+ { url = "https://files.pythonhosted.org/packages/71/30/3758bcf9e0b6a4193a6f51abf84254aba00887dfa8c20aba18aa366c5f57/ruff-0.14.2-py3-none-win_amd64.whl", hash = "sha256:0df3424aa5c3c08b34ed8ce099df1021e3adaca6e90229273496b839e5a7e1af", size = 13565279, upload-time = "2025-10-23T19:36:56.578Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/5d/aa883766f8ef9ffbe6aa24f7192fb71632f31a30e77eb39aa2b0dc4290ac/ruff-0.14.2-py3-none-win_arm64.whl", hash = "sha256:ea9d635e83ba21569fbacda7e78afbfeb94911c9434aff06192d9bc23fd5495a", size = 12554956, upload-time = "2025-10-23T19:36:58.714Z" },
+]
+
+[[package]]
+name = "setuptools"
+version = "80.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
+]
+
+[[package]]
+name = "sympy"
+version = "1.14.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mpmath" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
+]
+
+[[package]]
+name = "termcolor"
+version = "3.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324, upload-time = "2025-04-30T11:37:53.791Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload-time = "2025-04-30T11:37:52.382Z" },
+]
+
+[[package]]
+name = "tiktoken"
+version = "0.12.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "regex" },
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/4d017d0f76ec3171d469d80fc03dfbb4e48a4bcaddaa831b31d526f05edc/tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931", size = 37806, upload-time = "2025-10-06T20:22:45.419Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/46/21ea696b21f1d6d1efec8639c204bdf20fde8bafb351e1355c72c5d7de52/tiktoken-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e227c7f96925003487c33b1b32265fad2fbcec2b7cf4817afb76d416f40f6bb", size = 1051565, upload-time = "2025-10-06T20:21:44.566Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/d9/35c5d2d9e22bb2a5f74ba48266fb56c63d76ae6f66e02feb628671c0283e/tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa", size = 995284, upload-time = "2025-10-06T20:21:45.622Z" },
+ { url = "https://files.pythonhosted.org/packages/01/84/961106c37b8e49b9fdcf33fe007bb3a8fdcc380c528b20cc7fbba80578b8/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc", size = 1129201, upload-time = "2025-10-06T20:21:47.074Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/d0/3d9275198e067f8b65076a68894bb52fd253875f3644f0a321a720277b8a/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded", size = 1152444, upload-time = "2025-10-06T20:21:48.139Z" },
+ { url = "https://files.pythonhosted.org/packages/78/db/a58e09687c1698a7c592e1038e01c206569b86a0377828d51635561f8ebf/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd", size = 1195080, upload-time = "2025-10-06T20:21:49.246Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/1b/a9e4d2bf91d515c0f74afc526fd773a812232dd6cda33ebea7f531202325/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967", size = 1255240, upload-time = "2025-10-06T20:21:50.274Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/15/963819345f1b1fb0809070a79e9dd96938d4ca41297367d471733e79c76c/tiktoken-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e68e3e593637b53e56f7237be560f7a394451cb8c11079755e80ae64b9e6def", size = 879422, upload-time = "2025-10-06T20:21:51.734Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/85/be65d39d6b647c79800fd9d29241d081d4eeb06271f383bb87200d74cf76/tiktoken-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b97f74aca0d78a1ff21b8cd9e9925714c15a9236d6ceacf5c7327c117e6e21e8", size = 1050728, upload-time = "2025-10-06T20:21:52.756Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/42/6573e9129bc55c9bf7300b3a35bef2c6b9117018acca0dc760ac2d93dffe/tiktoken-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b", size = 994049, upload-time = "2025-10-06T20:21:53.782Z" },
+ { url = "https://files.pythonhosted.org/packages/66/c5/ed88504d2f4a5fd6856990b230b56d85a777feab84e6129af0822f5d0f70/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37", size = 1129008, upload-time = "2025-10-06T20:21:54.832Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/90/3dae6cc5436137ebd38944d396b5849e167896fc2073da643a49f372dc4f/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad", size = 1152665, upload-time = "2025-10-06T20:21:56.129Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/fe/26df24ce53ffde419a42f5f53d755b995c9318908288c17ec3f3448313a3/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5", size = 1194230, upload-time = "2025-10-06T20:21:57.546Z" },
+ { url = "https://files.pythonhosted.org/packages/20/cc/b064cae1a0e9fac84b0d2c46b89f4e57051a5f41324e385d10225a984c24/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3", size = 1254688, upload-time = "2025-10-06T20:21:58.619Z" },
+ { url = "https://files.pythonhosted.org/packages/81/10/b8523105c590c5b8349f2587e2fdfe51a69544bd5a76295fc20f2374f470/tiktoken-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffc5288f34a8bc02e1ea7047b8d041104791d2ddbf42d1e5fa07822cbffe16bd", size = 878694, upload-time = "2025-10-06T20:21:59.876Z" },
+ { url = "https://files.pythonhosted.org/packages/00/61/441588ee21e6b5cdf59d6870f86beb9789e532ee9718c251b391b70c68d6/tiktoken-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:775c2c55de2310cc1bc9a3ad8826761cbdc87770e586fd7b6da7d4589e13dab3", size = 1050802, upload-time = "2025-10-06T20:22:00.96Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/05/dcf94486d5c5c8d34496abe271ac76c5b785507c8eae71b3708f1ad9b45a/tiktoken-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160", size = 993995, upload-time = "2025-10-06T20:22:02.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/70/5163fe5359b943f8db9946b62f19be2305de8c3d78a16f629d4165e2f40e/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa", size = 1128948, upload-time = "2025-10-06T20:22:03.814Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/da/c028aa0babf77315e1cef357d4d768800c5f8a6de04d0eac0f377cb619fa/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be", size = 1151986, upload-time = "2025-10-06T20:22:05.173Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/5a/886b108b766aa53e295f7216b509be95eb7d60b166049ce2c58416b25f2a/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a", size = 1194222, upload-time = "2025-10-06T20:22:06.265Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f8/4db272048397636ac7a078d22773dd2795b1becee7bc4922fe6207288d57/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3", size = 1255097, upload-time = "2025-10-06T20:22:07.403Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/32/45d02e2e0ea2be3a9ed22afc47d93741247e75018aac967b713b2941f8ea/tiktoken-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:b8a0cd0c789a61f31bf44851defbd609e8dd1e2c8589c614cc1060940ef1f697", size = 879117, upload-time = "2025-10-06T20:22:08.418Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/76/994fc868f88e016e6d05b0da5ac24582a14c47893f4474c3e9744283f1d5/tiktoken-0.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d5f89ea5680066b68bcb797ae85219c72916c922ef0fcdd3480c7d2315ffff16", size = 1050309, upload-time = "2025-10-06T20:22:10.939Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/b8/57ef1456504c43a849821920d582a738a461b76a047f352f18c0b26c6516/tiktoken-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a", size = 993712, upload-time = "2025-10-06T20:22:12.115Z" },
+ { url = "https://files.pythonhosted.org/packages/72/90/13da56f664286ffbae9dbcfadcc625439142675845baa62715e49b87b68b/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27", size = 1128725, upload-time = "2025-10-06T20:22:13.541Z" },
+ { url = "https://files.pythonhosted.org/packages/05/df/4f80030d44682235bdaecd7346c90f67ae87ec8f3df4a3442cb53834f7e4/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb", size = 1151875, upload-time = "2025-10-06T20:22:14.559Z" },
+ { url = "https://files.pythonhosted.org/packages/22/1f/ae535223a8c4ef4c0c1192e3f9b82da660be9eb66b9279e95c99288e9dab/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e", size = 1194451, upload-time = "2025-10-06T20:22:15.545Z" },
+ { url = "https://files.pythonhosted.org/packages/78/a7/f8ead382fce0243cb625c4f266e66c27f65ae65ee9e77f59ea1653b6d730/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25", size = 1253794, upload-time = "2025-10-06T20:22:16.624Z" },
+ { url = "https://files.pythonhosted.org/packages/93/e0/6cc82a562bc6365785a3ff0af27a2a092d57c47d7a81d9e2295d8c36f011/tiktoken-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dc2dd125a62cb2b3d858484d6c614d136b5b848976794edfb63688d539b8b93f", size = 878777, upload-time = "2025-10-06T20:22:18.036Z" },
+ { url = "https://files.pythonhosted.org/packages/72/05/3abc1db5d2c9aadc4d2c76fa5640134e475e58d9fbb82b5c535dc0de9b01/tiktoken-0.12.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a90388128df3b3abeb2bfd1895b0681412a8d7dc644142519e6f0a97c2111646", size = 1050188, upload-time = "2025-10-06T20:22:19.563Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/7b/50c2f060412202d6c95f32b20755c7a6273543b125c0985d6fa9465105af/tiktoken-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:da900aa0ad52247d8794e307d6446bd3cdea8e192769b56276695d34d2c9aa88", size = 993978, upload-time = "2025-10-06T20:22:20.702Z" },
+ { url = "https://files.pythonhosted.org/packages/14/27/bf795595a2b897e271771cd31cb847d479073497344c637966bdf2853da1/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:285ba9d73ea0d6171e7f9407039a290ca77efcdb026be7769dccc01d2c8d7fff", size = 1129271, upload-time = "2025-10-06T20:22:22.06Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/9341a6d7a8f1b448573bbf3425fa57669ac58258a667eb48a25dfe916d70/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:d186a5c60c6a0213f04a7a802264083dea1bbde92a2d4c7069e1a56630aef830", size = 1151216, upload-time = "2025-10-06T20:22:23.085Z" },
+ { url = "https://files.pythonhosted.org/packages/75/0d/881866647b8d1be4d67cb24e50d0c26f9f807f994aa1510cb9ba2fe5f612/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:604831189bd05480f2b885ecd2d1986dc7686f609de48208ebbbddeea071fc0b", size = 1194860, upload-time = "2025-10-06T20:22:24.602Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/1e/b651ec3059474dab649b8d5b69f5c65cd8fcd8918568c1935bd4136c9392/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8f317e8530bb3a222547b85a58583238c8f74fd7a7408305f9f63246d1a0958b", size = 1254567, upload-time = "2025-10-06T20:22:25.671Z" },
+ { url = "https://files.pythonhosted.org/packages/80/57/ce64fd16ac390fafde001268c364d559447ba09b509181b2808622420eec/tiktoken-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:399c3dd672a6406719d84442299a490420b458c44d3ae65516302a99675888f3", size = 921067, upload-time = "2025-10-06T20:22:26.753Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/a4/72eed53e8976a099539cdd5eb36f241987212c29629d0a52c305173e0a68/tiktoken-0.12.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2c714c72bc00a38ca969dae79e8266ddec999c7ceccd603cc4f0d04ccd76365", size = 1050473, upload-time = "2025-10-06T20:22:27.775Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/d7/0110b8f54c008466b19672c615f2168896b83706a6611ba6e47313dbc6e9/tiktoken-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cbb9a3ba275165a2cb0f9a83f5d7025afe6b9d0ab01a22b50f0e74fee2ad253e", size = 993855, upload-time = "2025-10-06T20:22:28.799Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/77/4f268c41a3957c418b084dd576ea2fad2e95da0d8e1ab705372892c2ca22/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:dfdfaa5ffff8993a3af94d1125870b1d27aed7cb97aa7eb8c1cefdbc87dbee63", size = 1129022, upload-time = "2025-10-06T20:22:29.981Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/2b/fc46c90fe5028bd094cd6ee25a7db321cb91d45dc87531e2bdbb26b4867a/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:584c3ad3d0c74f5269906eb8a659c8bfc6144a52895d9261cdaf90a0ae5f4de0", size = 1150736, upload-time = "2025-10-06T20:22:30.996Z" },
+ { url = "https://files.pythonhosted.org/packages/28/c0/3c7a39ff68022ddfd7d93f3337ad90389a342f761c4d71de99a3ccc57857/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54c891b416a0e36b8e2045b12b33dd66fb34a4fe7965565f1b482da50da3e86a", size = 1194908, upload-time = "2025-10-06T20:22:32.073Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/0d/c1ad6f4016a3968c048545f5d9b8ffebf577774b2ede3e2e352553b685fe/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5edb8743b88d5be814b1a8a8854494719080c28faaa1ccbef02e87354fe71ef0", size = 1253706, upload-time = "2025-10-06T20:22:33.385Z" },
+ { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" },
+ { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" },
+ { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" },
+ { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" },
+ { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" },
+ { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" },
+ { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" },
+ { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" },
+ { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" },
+ { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" },
+ { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" },
+ { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" },
+]
+
+[[package]]
+name = "torch"
+version = "2.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "filelock" },
+ { name = "fsspec" },
+ { name = "jinja2" },
+ { name = "networkx" },
+ { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "setuptools", marker = "python_full_version >= '3.12'" },
+ { name = "sympy" },
+ { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
+ { name = "typing-extensions" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/c4/3e7a3887eba14e815e614db70b3b529112d1513d9dae6f4d43e373360b7f/torch-2.8.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:220a06fd7af8b653c35d359dfe1aaf32f65aa85befa342629f716acb134b9710", size = 102073391, upload-time = "2025-08-06T14:53:20.937Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/63/4fdc45a0304536e75a5e1b1bbfb1b56dd0e2743c48ee83ca729f7ce44162/torch-2.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c12fa219f51a933d5f80eeb3a7a5d0cbe9168c0a14bbb4055f1979431660879b", size = 888063640, upload-time = "2025-08-06T14:55:05.325Z" },
+ { url = "https://files.pythonhosted.org/packages/84/57/2f64161769610cf6b1c5ed782bd8a780e18a3c9d48931319f2887fa9d0b1/torch-2.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c7ef765e27551b2fbfc0f41bcf270e1292d9bf79f8e0724848b1682be6e80aa", size = 241366752, upload-time = "2025-08-06T14:53:38.692Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/5e/05a5c46085d9b97e928f3f037081d3d2b87fb4b4195030fc099aaec5effc/torch-2.8.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:5ae0524688fb6707c57a530c2325e13bb0090b745ba7b4a2cd6a3ce262572916", size = 73621174, upload-time = "2025-08-06T14:53:25.44Z" },
+ { url = "https://files.pythonhosted.org/packages/49/0c/2fd4df0d83a495bb5e54dca4474c4ec5f9c62db185421563deeb5dabf609/torch-2.8.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e2fab4153768d433f8ed9279c8133a114a034a61e77a3a104dcdf54388838705", size = 101906089, upload-time = "2025-08-06T14:53:52.631Z" },
+ { url = "https://files.pythonhosted.org/packages/99/a8/6acf48d48838fb8fe480597d98a0668c2beb02ee4755cc136de92a0a956f/torch-2.8.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2aca0939fb7e4d842561febbd4ffda67a8e958ff725c1c27e244e85e982173c", size = 887913624, upload-time = "2025-08-06T14:56:44.33Z" },
+ { url = "https://files.pythonhosted.org/packages/af/8a/5c87f08e3abd825c7dfecef5a0f1d9aa5df5dd0e3fd1fa2f490a8e512402/torch-2.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f4ac52f0130275d7517b03a33d2493bab3693c83dcfadf4f81688ea82147d2e", size = 241326087, upload-time = "2025-08-06T14:53:46.503Z" },
+ { url = "https://files.pythonhosted.org/packages/be/66/5c9a321b325aaecb92d4d1855421e3a055abd77903b7dab6575ca07796db/torch-2.8.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:619c2869db3ada2c0105487ba21b5008defcc472d23f8b80ed91ac4a380283b0", size = 73630478, upload-time = "2025-08-06T14:53:57.144Z" },
+ { url = "https://files.pythonhosted.org/packages/10/4e/469ced5a0603245d6a19a556e9053300033f9c5baccf43a3d25ba73e189e/torch-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2b2f96814e0345f5a5aed9bf9734efa913678ed19caf6dc2cddb7930672d6128", size = 101936856, upload-time = "2025-08-06T14:54:01.526Z" },
+ { url = "https://files.pythonhosted.org/packages/16/82/3948e54c01b2109238357c6f86242e6ecbf0c63a1af46906772902f82057/torch-2.8.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:65616ca8ec6f43245e1f5f296603e33923f4c30f93d65e103d9e50c25b35150b", size = 887922844, upload-time = "2025-08-06T14:55:50.78Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/54/941ea0a860f2717d86a811adf0c2cd01b3983bdd460d0803053c4e0b8649/torch-2.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:659df54119ae03e83a800addc125856effda88b016dfc54d9f65215c3975be16", size = 241330968, upload-time = "2025-08-06T14:54:45.293Z" },
+ { url = "https://files.pythonhosted.org/packages/de/69/8b7b13bba430f5e21d77708b616f767683629fc4f8037564a177d20f90ed/torch-2.8.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:1a62a1ec4b0498930e2543535cf70b1bef8c777713de7ceb84cd79115f553767", size = 73915128, upload-time = "2025-08-06T14:54:34.769Z" },
+ { url = "https://files.pythonhosted.org/packages/15/0e/8a800e093b7f7430dbaefa80075aee9158ec22e4c4fc3c1a66e4fb96cb4f/torch-2.8.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:83c13411a26fac3d101fe8035a6b0476ae606deb8688e904e796a3534c197def", size = 102020139, upload-time = "2025-08-06T14:54:39.047Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/15/5e488ca0bc6162c86a33b58642bc577c84ded17c7b72d97e49b5833e2d73/torch-2.8.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:8f0a9d617a66509ded240add3754e462430a6c1fc5589f86c17b433dd808f97a", size = 887990692, upload-time = "2025-08-06T14:56:18.286Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/a8/6a04e4b54472fc5dba7ca2341ab219e529f3c07b6941059fbf18dccac31f/torch-2.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a7242b86f42be98ac674b88a4988643b9bc6145437ec8f048fea23f72feb5eca", size = 241603453, upload-time = "2025-08-06T14:55:22.945Z" },
+ { url = "https://files.pythonhosted.org/packages/04/6e/650bb7f28f771af0cb791b02348db8b7f5f64f40f6829ee82aa6ce99aabe/torch-2.8.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:7b677e17f5a3e69fdef7eb3b9da72622f8d322692930297e4ccb52fefc6c8211", size = 73632395, upload-time = "2025-08-06T14:55:28.645Z" },
+]
+
+[[package]]
+name = "tox"
+version = "4.31.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cachetools" },
+ { name = "chardet" },
+ { name = "colorama" },
+ { name = "filelock" },
+ { name = "packaging" },
+ { name = "platformdirs" },
+ { name = "pluggy" },
+ { name = "pyproject-api" },
+ { name = "virtualenv" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/be/b9/1750ebb6e8e2d198a17822b7b851dea33e61dcc9c25f55a3e3636f67389a/tox-4.31.0.tar.gz", hash = "sha256:266381ffef35615ec0d40ae4969a9e43b506017597c0413d6545a603cc8c7561", size = 203294, upload-time = "2025-10-09T18:53:53.619Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3e/84/1691aae773dccff72c866ad19af7adb12d4fb8b439c8bfb36ffc429c8c27/tox-4.31.0-py3-none-any.whl", hash = "sha256:328f392e6567e46cb0f9b625679456744dde940287dd1b39117627dc4b21d5da", size = 175917, upload-time = "2025-10-09T18:53:51.494Z" },
+]
+
+[[package]]
+name = "tox-uv"
+version = "1.29.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+ { name = "tox" },
+ { name = "uv" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4f/90/06752775b8cfadba8856190f5beae9f552547e0f287e0246677972107375/tox_uv-1.29.0.tar.gz", hash = "sha256:30fa9e6ad507df49d3c6a2f88894256bcf90f18e240a00764da6ecab1db24895", size = 23427, upload-time = "2025-10-09T20:40:27.384Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5c/17/221d62937c4130b044bb437caac4181e7e13d5536bbede65264db1f0ac9f/tox_uv-1.29.0-py3-none-any.whl", hash = "sha256:b1d251286edeeb4bc4af1e24c8acfdd9404700143c2199ccdbb4ea195f7de6cc", size = 17254, upload-time = "2025-10-09T20:40:25.885Z" },
+]
+
+[[package]]
+name = "tqdm"
+version = "4.67.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
+]
+
+[[package]]
+name = "transcriber"
+version = "0.0.1"
+source = { editable = "." }
+dependencies = [
+ { name = "numpy" },
+ { name = "openai-whisper" },
+ { name = "pydub" },
+ { name = "pysrt" },
+]
+
+[package.optional-dependencies]
+dev = [
+ { name = "coverage" },
+ { name = "deptry" },
+ { name = "mkdocs" },
+ { name = "mkdocs-coverage" },
+ { name = "mkdocs-material" },
+ { name = "mkdocstrings", extra = ["python"] },
+ { name = "mypy" },
+ { name = "pip-review" },
+ { name = "pre-commit" },
+ { name = "pysonar" },
+ { name = "pytest" },
+ { name = "pytest-clarity" },
+ { name = "pytest-cov" },
+ { name = "pytest-mock" },
+ { name = "pytest-sugar" },
+ { name = "ruff" },
+ { name = "tox-uv" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "coverage" },
+ { name = "deptry" },
+ { name = "mkdocs" },
+ { name = "mkdocs-coverage" },
+ { name = "mkdocs-material" },
+ { name = "mkdocstrings", extra = ["python"] },
+ { name = "mypy" },
+ { name = "pip-review" },
+ { name = "pre-commit" },
+ { name = "pysonar" },
+ { name = "pytest" },
+ { name = "pytest-clarity" },
+ { name = "pytest-cov" },
+ { name = "pytest-mock" },
+ { name = "pytest-sugar" },
+ { name = "ruff" },
+ { name = "tox-uv" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.11.0" },
+ { name = "deptry", marker = "extra == 'dev'", specifier = ">=0.23.0" },
+ { name = "mkdocs", marker = "extra == 'dev'", specifier = ">=1.4.2" },
+ { name = "mkdocs-coverage", marker = "extra == 'dev'", specifier = ">=2.0.0" },
+ { name = "mkdocs-material", marker = "extra == 'dev'", specifier = ">=9.6.22" },
+ { name = "mkdocstrings", extras = ["python"], marker = "extra == 'dev'", specifier = ">=0.26.1" },
+ { name = "mypy", marker = "extra == 'dev'", specifier = ">=0.991" },
+ { name = "numpy" },
+ { name = "openai-whisper" },
+ { name = "pip-review", marker = "extra == 'dev'", specifier = ">=1.3.0" },
+ { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=2.20.0" },
+ { name = "pydub" },
+ { name = "pysonar", marker = "extra == 'dev'", specifier = ">=1.2.0" },
+ { name = "pysrt" },
+ { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.2.0" },
+ { name = "pytest-clarity", marker = "extra == 'dev'", specifier = ">=1.0.1" },
+ { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" },
+ { name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.15.0" },
+ { name = "pytest-sugar", marker = "extra == 'dev'", specifier = ">=1.1.0" },
+ { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.14.2" },
+ { name = "tox-uv", marker = "extra == 'dev'", specifier = ">=1.29.0" },
+]
+provides-extras = ["dev"]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "coverage", specifier = ">=7.11.0" },
+ { name = "deptry", specifier = ">=0.23.0" },
+ { name = "mkdocs", specifier = ">=1.4.2" },
+ { name = "mkdocs-coverage", specifier = ">=2.0.0" },
+ { name = "mkdocs-material", specifier = ">=8.5.10" },
+ { name = "mkdocstrings", extras = ["python"], specifier = ">=0.26.1" },
+ { name = "mypy", specifier = ">=0.991" },
+ { name = "pip-review", specifier = ">=1.3.0" },
+ { name = "pre-commit", specifier = ">=2.20.0" },
+ { name = "pysonar", specifier = ">=1.2.0" },
+ { name = "pytest", specifier = ">=7.2.0" },
+ { name = "pytest-clarity", specifier = ">=1.0.1" },
+ { name = "pytest-cov", specifier = ">=4.0.0" },
+ { name = "pytest-mock", specifier = ">=3.15.0" },
+ { name = "pytest-sugar", specifier = ">=1.1.0" },
+ { name = "ruff", specifier = ">=0.14.2" },
+ { name = "tox-uv", specifier = ">=1.29.0" },
+]
+
+[[package]]
+name = "triton"
+version = "3.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "setuptools" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7d/39/43325b3b651d50187e591eefa22e236b2981afcebaefd4f2fc0ea99df191/triton-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b70f5e6a41e52e48cfc087436c8a28c17ff98db369447bcaff3b887a3ab4467", size = 155531138, upload-time = "2025-07-30T19:58:29.908Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/66/b1eb52839f563623d185f0927eb3530ee4d5ffe9d377cdaf5346b306689e/triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c1d84a5c0ec2c0f8e8a072d7fd150cab84a9c239eaddc6706c081bfae4eb04", size = 155560068, upload-time = "2025-07-30T19:58:37.081Z" },
+ { url = "https://files.pythonhosted.org/packages/30/7b/0a685684ed5322d2af0bddefed7906674f67974aa88b0fae6e82e3b766f6/triton-3.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00be2964616f4c619193cb0d1b29a99bd4b001d7dc333816073f92cf2a8ccdeb", size = 155569223, upload-time = "2025-07-30T19:58:44.017Z" },
+ { url = "https://files.pythonhosted.org/packages/20/63/8cb444ad5cdb25d999b7d647abac25af0ee37d292afc009940c05b82dda0/triton-3.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7936b18a3499ed62059414d7df563e6c163c5e16c3773678a3ee3d417865035d", size = 155659780, upload-time = "2025-07-30T19:58:51.171Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
+]
+
+[[package]]
+name = "uv"
+version = "0.9.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2e/23/70eb7805be75d698c244d5fb085d6af454e7d0417eea18f9ad8cbabd6df9/uv-0.9.2.tar.gz", hash = "sha256:78d58c1489dcff2fa9de8c1829a627c65a04571732dfc862e4dc7b88874df01b", size = 3693596, upload-time = "2025-10-10T19:02:06.236Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/12/af/2fb37e18842148e90327a284ad8db7c89a78c8b884fce298173fda44edb3/uv-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:9e3ad7f9ca7f327c4d507840b817592a3599746e138d545791ebb2eca15f34a1", size = 20606301, upload-time = "2025-10-10T19:01:19.2Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/ef/6dc7d0506c69edbfbba595768f96a035a85249671a57d163e31ed47c829b/uv-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6bd0e1b4135789ee3855d38da17eca8cc9d5b2e3f96023be191422bd6751f0b8", size = 19593291, upload-time = "2025-10-10T19:01:23.801Z" },
+ { url = "https://files.pythonhosted.org/packages/01/b6/d422f2353482ca7c5b8175a35d2e07d14d700f53bd4f95d5e86a3d451996/uv-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:939bdd13e37330d8fb43683a10a2586c0d21c353184d9ca28251842e249356e4", size = 18175720, upload-time = "2025-10-10T19:01:26.052Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/ca/53b5819315fe01bec2911b48a2bdb800ac9ab1cf76c5d959199271540eb5/uv-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:b75e8762b7b3f7fc15a065bd6fcb56007c19d952c94b9e45968e47bdd7adc289", size = 20024004, upload-time = "2025-10-10T19:01:28.661Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/77/4a1d5b132eb072388250855e2e507d4ce5dbd31045f172d6a6266e6e1c95/uv-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47a29843d6c2c14533492de585b5b7826a48f54e4796e47db4511b78f7738af5", size = 20199272, upload-time = "2025-10-10T19:01:31.436Z" },
+ { url = "https://files.pythonhosted.org/packages/44/ad/452124cd1ec0127f6ce277052fabd709aa18f51476a809fba8abb09cc734/uv-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cbe195d9a232344a8cf082e4fc4326a1f269fd4efe745d797a84d35008364cf", size = 21139676, upload-time = "2025-10-10T19:01:33.631Z" },
+ { url = "https://files.pythonhosted.org/packages/39/f7/54871ac979c31ba0f5897703d884b7b73399fdab83c6c054ec92c624c45a/uv-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:43ae1b5e4cb578a13299b4b105fc099e4300885d3ac0321b735d8c23d488bb1a", size = 22583678, upload-time = "2025-10-10T19:01:36.008Z" },
+ { url = "https://files.pythonhosted.org/packages/75/36/bc10c28b76b565b18b01b1b4a04f51ba19837db8adc8f4f0c9982c125a04/uv-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e46e0ac8796d888d7885af9243f4ec265e88872a74582bf3a8072c0e75578698", size = 22223038, upload-time = "2025-10-10T19:01:38.444Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/91/64f498195168891ae804489386dccd08a5c6a80fd9f35658161c9af8e33a/uv-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40b722a1891b42edf16573794281000479c0001b52574c10032206f3fb77870a", size = 21358696, upload-time = "2025-10-10T19:01:41.126Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/77/0ceb3c0fed4f43f3cb387a76170115bdb873822c5c2dc6036d05dd5b2070/uv-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50128cbeae27c4cb58973c39a2110169d13676525397a3c2de5394448ea5c58f", size = 21244422, upload-time = "2025-10-10T19:01:43.91Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/1c/5d6c9f6f648eda9db1567401c9d921d4f59afbbb4af83b5230b91a96aa48/uv-0.9.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:c6888f2a0d49819311780e158df0d09750f701095e46a59c3f5712f76bae952c", size = 20123453, upload-time = "2025-10-10T19:01:46.489Z" },
+ { url = "https://files.pythonhosted.org/packages/78/f5/d3896606ca57a358c175a343b34b3e1ebf29b31a6ae6ae6f3daf266db202/uv-0.9.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:b7f6f3e1bfc0d2bdadc12e01814169dae4fbd60cedc8f634987d66ae68aab99a", size = 21236450, upload-time = "2025-10-10T19:01:49.292Z" },
+ { url = "https://files.pythonhosted.org/packages/92/6e/e5b3d1500e0c21b1dcb5be798322885d43b3ca0e696309e30029d55ffa6d/uv-0.9.2-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:0cc3808e24f169869c7a0ad311cef672fef53cebcf6cc384a17be35c60146f4a", size = 20146874, upload-time = "2025-10-10T19:01:51.565Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/04/966fe4aed5f4753f2c04af611263a0cbc64e84d21b13979258a64c08e801/uv-0.9.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:042f8b3773160b769efbbf34f704f99efddb248283325309bb78ffe6e7c96425", size = 20527007, upload-time = "2025-10-10T19:01:53.893Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/fc/6cb19e86592ffe51c9d2b33ca51dce700e22a42da3de9f4245f735357cb2/uv-0.9.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d7072e10e2d4e3342476a831e4adf1a7a490d8a3a99c5538d3e13400c4849b29", size = 21469236, upload-time = "2025-10-10T19:01:56.465Z" },
+ { url = "https://files.pythonhosted.org/packages/24/95/1e539dae42d124749faaae22d27e239911e5b1676fedab716434c56aa869/uv-0.9.2-py3-none-win32.whl", hash = "sha256:ed2ce9a58e3e9df51387907163da649129e71b75c98ab7fec1d23c57640c62ae", size = 19376589, upload-time = "2025-10-10T19:01:58.794Z" },
+ { url = "https://files.pythonhosted.org/packages/27/33/f1b73f9d019dcfe83fb545e5d0d080952300248d547433bb975ad7fd3331/uv-0.9.2-py3-none-win_amd64.whl", hash = "sha256:27815edaa0be4f6346b24f3b6a4389f7747ae98538f4e2e8946090bb959389cc", size = 21359072, upload-time = "2025-10-10T19:02:01.13Z" },
+ { url = "https://files.pythonhosted.org/packages/39/aa/e23b96625a51266f2218cf0e0751ada65f138a57910fc0810cdd9d28d76f/uv-0.9.2-py3-none-win_arm64.whl", hash = "sha256:86e8fc3424266c9afca829d3936e91b677027658a253c7bb2a299fafd97aab0d", size = 19810880, upload-time = "2025-10-10T19:02:03.868Z" },
+]
+
+[[package]]
+name = "virtualenv"
+version = "20.35.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "distlib" },
+ { name = "filelock" },
+ { name = "platformdirs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a4/d5/b0ccd381d55c8f45d46f77df6ae59fbc23d19e901e2d523395598e5f4c93/virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44", size = 6002907, upload-time = "2025-10-10T21:23:33.178Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" },
+]
+
+[[package]]
+name = "watchdog"
+version = "6.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" },
+ { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" },
+ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" },
+ { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" },
+ { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" },
+ { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" },
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" },
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" },
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" },
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" },
+]