วันเสาร์ที่ 5 ตุลาคม พ.ศ. 2562

C# จัดการ Zip file

C# จัดการ Zip ให้ Reference system.io.compression และ system.io.compression.filesystem

ในการ List ไฟล์ใน Zip
   private void button_open_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();

            string zipPath = label1.Text;

                using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                        // Gets the full path to ensure that relative segments are removed.
                        string destinationPath =  entry.FullName;
                        listBox1.Items.Add(destinationPath);
            
                }
            }
        }
ในการ Extract File ออกมา แล้ว edit ด้วย Notepad

  private void button_Edit_Click(object sender, EventArgs e)
        { // select file
            int index = listBox1.SelectedIndex;
            string sFile = listBox1.Items[index].ToString();
            // extract file
            string exPath = "c:/temp/";
            string zipPath = label1.Text;

            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    // Gets the full path to ensure that relative segments are removed.
                    string destinationPath = exPath+entry.FullName;
                    if (entry.FullName == sFile)
                    { // extrac file

                        entry.ExtractToFile(destinationPath,true);
                        label_msg.Text = "Extract to " + destinationPath;
                        string editor = @"C:\WINDOWS\NOTEPAD.EXE";
                        Process.Start(editor, destinationPath);
                    }
                    
                }
            }
        }


ในการ Delete File เดิม และ จัดเก็บ


 private void button_Save_Click(object sender, EventArgs e)
        {
            int index = listBox1.SelectedIndex;
            string sFile = listBox1.Items[index].ToString();
            // extract file
            string exPath = "c:/temp/";
            string zipPath = label1.Text;

            using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
            {
                // delete old file
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    // Gets the full path to ensure that relative segments are removed.
                    string destinationPath1 = exPath + entry.FullName;
                    if (entry.FullName == sFile)
                    { // extrac file
                        entry.Delete();
                        label_msg.Text = "delete zip " + sFile;
                        break;
                    }

                }

            }
            // update 
            using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
            { 
                string destinationPath = exPath + sFile;
                    archive.CreateEntryFromFile(destinationPath, sFile);
                    
                    label_msg.Text = "Zip to " + destinationPath;
                    return;
                
            }
        }

Revit หา Duct ตัด กำแพง

หลักการ เป็นการ หา Curve ของ Duct เป็น XYZ และ ตัดกับ Face ของ กำแพง

 public static void ductIntersectWall(ExternalCommandData cmd)
        {
            UIApplication uiapp = cmd.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
            Autodesk.Revit.DB.Document CachedDoc = uidoc.Document;
            {
                 FilteredElementCollector WallCollector = new FilteredElementCollector(CachedDoc);
                WallCollector.OfClass(typeof(Wall));
                List<Wall> walls = WallCollector.Cast<Wall>().ToList();// หา กำแพง

                FilteredElementCollector DuctCollector = new FilteredElementCollector(CachedDoc);
                DuctCollector.OfClass(typeof(Duct)); // หา Duct

                List<Duct> ducts = DuctCollector.Cast<Duct>().ToList();
                List<XYZ> points = new List<XYZ>();

                foreach (Duct d in ducts)
                {
                    foreach (Wall w in walls)
                    {
                        LocationCurve lc = d.Location as LocationCurve;
                        Curve ductCurve = lc.Curve; // แต่ละ Duct หา เป็น เส้นCurve

                        XYZ intersection = null;

                        List<Face> wallFaces = FindWallFace(w); // หา หน้า Face ของกำแพง

                        foreach (Face f in wallFaces)
                        {
                            intersection = FindFaceCurve(ductCurve, f); // หาจุดตัด Face กับ เส้น duct
                            if (null != intersection)
                                points.Add(intersection);
                        }
                    }
                }

                StringBuilder sb = new StringBuilder();

                foreach (XYZ p in points)
                {
                    sb.AppendLine(p.ToString()); // เก็บ ไปแสดงค่าจุดตัด
                }
                TaskDialog.Show("duct inter wall(ft)", sb.ToString());
             }
            }
        // support function
        public static List<Face> FindWallFace(Wall wall)
        {
            List<Face> normalFaces = new List<Face>();

            Options opt = new Options();
            opt.ComputeReferences = true;
            opt.DetailLevel = ViewDetailLevel.Fine;

            GeometryElement e = wall.get_Geometry(opt);

            foreach (GeometryObject obj in e)
            {
                Solid solid = obj as Solid;

                if (solid != null && solid.Faces.Size > 0)
                {
                    foreach (Face face in solid.Faces)
                    {
                        PlanarFace pf = face as PlanarFace;
                        if (pf != null)
                        {
                            normalFaces.Add(pf);
                        }
                    }
                }
            }
            return normalFaces;
        }

        public static XYZ FindFaceCurve(Curve DuctCurve, Face WallFace)
        {
            //The intersection point
            IntersectionResultArray intersectionR = new IntersectionResultArray();//Intersection point set

            SetComparisonResult results;//Results of Comparison

            results = WallFace.Intersect(DuctCurve, out intersectionR);

            XYZ intersectionResult = null;//Intersection coordinate

            if (SetComparisonResult.Disjoint != results)
            {
                if (intersectionR != null)
                {
                    if (!intersectionR.IsEmpty)
                    {
                        intersectionResult = intersectionR.get_Item(0).XYZPoint;
                    }
                }
            }
            return intersectionResult;

        }