Friday, February 26, 2021

Cleaning a Maytag MHW5630HW2 Drain Pump Filter

I couldn’t find the instructions on how to clean out the Maytag MHW5630HW2’s drain pump filter. Most videos covered other manuals that required removing the front cover, taking off the back cover, or some combination of the two. 

There is a different way to accomplish the task. 

1. Unplug the power and turn off the water. 

2. Pull out the washer to a location where you can lean the washer up so you can gain access to the big hole that resides at the bottom of the washer. 


3. Pull out the four pins that hold the baseplate that holds the drain pump. The pins are number 19 in the image below. The grommets are number 19 and the drain pump filter is items 13 to 15. 


4. Detach the two electrical connectors on either side of the drain pump. 

5. Pull them out from under the washer enough to gain access to the black drain pipe and then unplug item 18 from it and have it drain into a vessel that can contain all of the water. In my case, I had to replug the black drain pipe twice to empty my vessel. 

6. After the water stops coming out of the black drain pipe, place the plug back in. 

7. Twist the drain pump filter, item 13, to open it up. Be careful because even more water will come out. Make sure to have your vessel ready to capture the water. 

8. Clean the drain pump filter and remove any objects obstructing it. In my case, there was some fabric that made its way down. 

9. To reassemble the removed parts, I found the best way was to remove the grommets from the base plate holding the drain pump at the front of the washer.

10. Then place the two grommets into the holes at the front of the washer. 

11. Place the two pins into the grommets at the front of the washer. 

12. Push the base plate with the drain pump into the grommets. It should slide right in. 

13. Position the two grommets that are still on the base plate into the two holes furthest away from the front of the washer. 

14. Add the pins to the grommets to secure the base plate to the washer. 

15. Put the washer back on the ground. 

16. Push the washer back into place and then turn back on the water and plug the power cord back into the electrical outlet. 

Screenshots taken from Appliance Parts Pros, I have no idea where they got their images and they did not sponsor this blog post.

Wednesday, February 03, 2021

Offset 3D Polyline VBA

Here is how I would offset a 3D Polyline for Civil 3D purposes. It's a bit different than for mechanical because civil engineering works in 2-1/2 D. 

The first step is to collect all of the 3D Vertices. this forum post has an example:

Then create a polyline from the 3D Vertices and offset the polyline. The help file has some good code for that:

Then collect the polyline vertices and create a new 3D Polyline assigning the appropriate elevation to the vertices. Here is a link to the help file for that:

Thursday, January 28, 2021

Civil 3D Version Numbers

Here is a list of Civil 3D Version numbers and AutoCAD Version Numbers:

Civil 3D 2011 "8.0" AutoCAD R18.1

Civil 3D 2012 "9.0" AutoCAD R18.2

Civil 3D 2013 "10.0" AutoCAD R19.0

Civil 3D 2014 "10.3" AutoCAD R19.1

Civil 3D 2015 "10.4" AutoCAD R20.0

Civil 3D 2016 "10.5" AutoCAD R20.1

Civil 3D 2017 "11.0" AutoCAD R21.0

Civil 3D 2018 "12.0" AutoCAD R22.0

Civil 3D 2019 "13.0" AutoCAD R23.0

Civil 3D 2020 "13.2" AutoCAD R23.1

Civil 3D 2021 "13.3" AutoCAD R24.0

If the pattern holds, then the numbers for the next version should be:

Civil 3D 2022 "13.4" AutoCAD R24.1

Monday, November 23, 2020

Privacy Policy

 1. Identify and describe the data, if any, that the App collects, how that data is collected, and all uses of that data.

Any apps created by Civil Reminders or Civil 3D Reminders blog does not collect any data. The app may use the Autodesk App Store entitlement to verify the license is authorized and any information for this process is stored by Autodesk and not Civil Reminders or Civil 3D Reminders blog.

2. Confirm that any third party with whom an App shares that data will provide the same protection of that data as stated in the App’s privacy policy. Examples of such third parties are analytics tools, advertising networks and third-party SDKs, as well as legal affiliates of the Publisher (parent, subsidiary, related entities).

Verify with Autodesk if they follow the rules. I don't control what they do.

3. Explain Publisher’s data retention and deletion policies.

No data is retained by Civil Reminders or Civil 3D Reminders. Refer to Autodesk to determine data retention and deletion policies for use of the Autodesk App Store Entitlement process.

4. Describe how end users can revoke consent and/or request deletion of their data.

No data is collected or retained. Refer to Autodesk to determine their process to revoke consent and/or delete data.

Sunday, September 27, 2020

Corridor Surface Shrink

This post is in regard to this Civil 3D Idea:

This post will provide a workflow to programmatically delete tin triangles outside of the corridor. 

This code deletes triangles, but it could be modified to add the polylines as boundaries instead of going through the triangles that are outside of the corridor.

It's not full proof, but it's intended to quickly get triangles that are outside of the corridor for design purposes.

The MPolygon requires a reference to this dll: 

C:\Program Files\Autodesk\AutoCAD 2021\AcMPolygonMGD.dll

    public class CorridorShrinkwrap
        public void CorridorShrinkwrapCommand()
            var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            var ed = doc.Editor;
            var db = doc.Database;

                using (var tr = doc.TransactionManager.StartTransaction())
                using (var btr = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord)
                    var corridorTypVals = new List<TypedValue>
                                new TypedValue((int)DxfCode.Operator, "<OR"),
                                new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(Corridor)).DxfName),
                                new TypedValue((int)DxfCode.Operator, "OR>")

                    var corrObjIds = ed.GetEntities(corridorTypVals, "\nSelect corridor: ", "\nSelection objects to remove",
                                                     out List<FullSubentityPath> xrefPaths);

                    if (!corrObjIds.Any())


                    var strRslt = ed.GetString("\nEnter link code to shrink to: ");

                    if (strRslt.Status != Autodesk.AutoCAD.EditorInput.PromptStatus.OK)

                    var code = strRslt.StringResult;
                    var tolerance = Tolerance.Global.EqualPoint;

                    foreach (var corrObjId in corrObjIds)
                        var corr = corrObjId.GetObject(OpenMode.ForWrite) as Corridor;
                        var polylines = new List<Polyline>();
                        var mpolys = new List<MPolygon>();
                        foreach (var baseline in corr.Baselines)
                            foreach (var region in baseline.BaselineRegions)
                                var polyPts = new List<Tuple<ObjectId, CalculatedPoint, CalculatedPoint>>();

                                foreach (var assembly in region.AppliedAssemblies)
                                    foreach (var subAss in assembly.GetAppliedSubassemblies())
                                        var links = subAss.Links.Where(x => x.CorridorCodes.Contains(code));
                                        if (!links.Any())
                                        var linkPoints = links.SelectMany(x => x.CalculatedPoints.Select(y => y)).OrderBy(z => z.StationOffsetElevationToBaseline.Y).ToList();
                                        polyPts.Add(new Tuple<ObjectId, CalculatedPoint, CalculatedPoint>(subAss.SubassemblyId, linkPoints.First(), linkPoints.Last()));

                                // Collect the points by subassembly.
                                var polyInfos = polyPts.GroupBy(x => x.Item1).ToDictionary(x => x.Key, x => x.OrderBy(y => y.Item2.StationOffsetElevationToBaseline.X).ToList());

                                foreach (var kvp in polyInfos)
                                    var poly = new Polyline();

                                    foreach (var pt in kvp.Value)
                                        poly.AddVertexAt(poly.NumberOfVertices, pt.Item2.XYZ.ToPoint2d(), 0, 0, 0);

                                    foreach (var pt in kvp.Value)
                                        poly.AddVertexAt(poly.NumberOfVertices, pt.Item3.XYZ.ToPoint2d(), 0, 0, 0);

                                    poly.Closed = true;

                                    var plObjId = btr.AppendEntity(poly);
                                    tr.AddNewlyCreatedDBObject(poly, true);


                                    var mPoly = new MPolygon();
                                    mPoly.AppendLoopFromBoundary(poly, true, tolerance);


                                // find the surfaces that contain the code. 
                                foreach (var corrSurf in corr.CorridorSurfaces.Where(x => x.LinkCodes().Contains(code)))
                                    var edgesToDelete = new List<TinSurfaceEdge>();
                                    var corrTinSurf = corrSurf.SurfaceId.GetObject(OpenMode.ForWrite) as TinSurface;
                                    foreach (var tinEdge in corrTinSurf.Triangles.SelectMany(x => new List<TinSurfaceEdge> { x.Edge1, x.Edge2, x.Edge3 }).Distinct())
                                        using (var tempLine = new Line(tinEdge.Vertex1.Location, tinEdge.Vertex2.Location))
                                            var midPt = tempLine.GetPointAtParameter((tempLine.EndParam - tempLine.StartParam) / 2);
                                            if (mpolys.Where(x => x.IsPointInsideMPolygon(midPt, tolerance).Count == 1).Any())

                                    if (!edgesToDelete.Any())

                        // dispose of the polylines. 
                        foreach (var poly in polylines)

                        foreach (var mPoly in mpolys)

            catch (System.Exception ex)
                ed.WriteMessage("\nError: " + ex.Message);


Blog Widget by LinkWithin