├── .gitattributes ├── .gitignore ├── App.config ├── CADSnoop.csproj ├── Documents ├── SnoopCad.gif └── _Image_bfad9808-fa10-4857-8d77-f1f0b161433f.png ├── LICENSE ├── Model ├── ObjectDetails.cs ├── RelayCommand.cs ├── ViewModelBase.cs └── WindowHandle.cs ├── PackageContents.xml ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── README.md ├── SnoopAutoCADCSharp.bundle ├── PackageContents.xml └── SnoopAutoCADCSharp.dll ├── SnoopAutoCADCSharp.sln ├── SnoopCommand.cs ├── View ├── MainWindow.xaml └── MainWindow.xaml.cs ├── ViewModel ├── SnoopViewModel.cs └── TreeViewCustom.cs └── inno_setup ├── Installer.iss └── Output └── SnoopAutoCADCSharp setup.exe /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #Ignore thumbnails created by Windows 2 | Thumbs.db 3 | 4 | #Ignore files built by Visual Studio 5 | *.obj 6 | *.exe 7 | *.pdb 8 | *.user 9 | *.aps 10 | *.pch 11 | *.vspscc 12 | *_i.c 13 | *_p.c 14 | *.ncb 15 | *.suo 16 | *.tlb 17 | *.tlh 18 | *.bak 19 | *.cache 20 | *.ilk 21 | *.log 22 | *.iref 23 | *.db 24 | *.ide 25 | *.opendb 26 | *.lock 27 | *.ide-shm 28 | *.ide-wal 29 | [Bb]in 30 | [Dd]ebug*/ 31 | *.lib 32 | *.sbr 33 | obj/ 34 | [Rr]elease*/ 35 | _ReSharper*/ 36 | [Tt]est[Rr]esult* 37 | .vs/ 38 | 39 | #Nuget packages folder 40 | packages/ 41 | 42 | 43 | -------------------------------------------------------------------------------- /App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CADSnoop.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | net48 4 | Library 5 | false 6 | true 7 | true 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 15 | None 16 | 17 | 18 | 19 | 20 | ..\RefrencedAssemblies\accoremgd.dll 21 | 22 | 23 | ..\RefrencedAssemblies\acdbmgd.dll 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Documents/SnoopCad.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htlcnn/AutoCADLookup/32944bd352e13d5276d8ed5039967e7472f77c59/Documents/SnoopCad.gif -------------------------------------------------------------------------------- /Documents/_Image_bfad9808-fa10-4857-8d77-f1f0b161433f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htlcnn/AutoCADLookup/32944bd352e13d5276d8ed5039967e7472f77c59/Documents/_Image_bfad9808-fa10-4857-8d77-f1f0b161433f.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Long 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Model/ObjectDetails.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace CADSnoop.Model 4 | { 5 | /// 6 | /// Information Of Object 7 | /// 8 | public class ObjectDetails 9 | { 10 | public string GroupName { get; set; } 11 | public string PropName { get; set; } 12 | public string Type { get; set; } 13 | public string Value { get; set; } 14 | public Object LinkObject { get; set; } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Model/RelayCommand.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Input; 3 | 4 | namespace CADSnoop.Model 5 | { 6 | public class RelayCommand : ICommand 7 | { 8 | readonly Action _execute; 9 | readonly Func _canExecute; 10 | 11 | public RelayCommand(Action execute, Func canExecute) 12 | { 13 | if (execute == null) 14 | throw new NullReferenceException("execute"); 15 | 16 | _execute = execute; 17 | _canExecute = canExecute; 18 | } 19 | 20 | public RelayCommand(Action execute) : this(execute, null) 21 | { 22 | 23 | } 24 | 25 | public event EventHandler CanExecuteChanged 26 | { 27 | add => CommandManager.RequerySuggested += value; 28 | remove => CommandManager.RequerySuggested -= value; 29 | } 30 | 31 | public bool CanExecute(object parameter) 32 | { 33 | return _canExecute == null ? true : _canExecute(); 34 | } 35 | 36 | public void Execute(object parameter) 37 | { 38 | _execute.Invoke(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Model/ViewModelBase.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Diagnostics; 3 | using System.Globalization; 4 | using System.Reflection; 5 | using System.Runtime.CompilerServices; 6 | 7 | namespace CADSnoop.Model 8 | { 9 | public class ViewModelBase : INotifyPropertyChanged 10 | { 11 | public event PropertyChangedEventHandler PropertyChanged; 12 | 13 | public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 14 | { 15 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 16 | } 17 | 18 | // 19 | /// Called when the specified property has been changed. 20 | /// 21 | /// Name of the property. 22 | /// The old value. 23 | /// The new value. 24 | protected virtual void OnPropertyChanged(string propertyName, object oldValue, object newValue) 25 | { 26 | this.OnPropertyChanged(propertyName); 27 | } 28 | 29 | #region Can Optimize 30 | /// 31 | /// 32 | /// 33 | /// 34 | /// 35 | /// 36 | /// 37 | public void OnPropertyChanged(ref T property, T value, [CallerMemberName] string propertyName = "") 38 | { 39 | property = value; 40 | var handler = PropertyChanged; 41 | if (handler != null) 42 | { 43 | PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 44 | } 45 | } 46 | 47 | #endregion 48 | 49 | /// 50 | /// Sets the property value. 51 | /// 52 | /// The type of the property. 53 | /// The field. 54 | /// The value. 55 | /// Name of the property. 56 | /// 57 | /// True if the property was set. 58 | /// 59 | /// This method uses the CallerMemberNameAttribute to determine the property name. 60 | protected bool SetValue(ref T field, T value, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") 61 | { 62 | // ReSharper disable once RedundantNameQualifier 63 | if (object.Equals(field, value)) 64 | { 65 | return false; 66 | } 67 | this.VerifyProperty(propertyName); 68 | //// this.OnPropertyChanging(propertyName, field, value); 69 | T oldValue = field; 70 | field = value; 71 | this.OnPropertyChanged(propertyName, oldValue, value); 72 | return true; 73 | } 74 | 75 | /// 76 | /// Verifies the property name. 77 | /// 78 | /// Name of the property. 79 | [Conditional("DEBUG")] 80 | private void VerifyProperty(string propertyName) 81 | { 82 | var type = this.GetType(); 83 | 84 | // Look for a public property with the specified name. 85 | var propertyInfo = type.GetTypeInfo().GetDeclaredProperty(propertyName); 86 | 87 | Debug.Assert(propertyInfo != null, string.Format(CultureInfo.InvariantCulture, "{0} is not a property of {1}", propertyName, type.FullName)); 88 | } 89 | } 90 | } -------------------------------------------------------------------------------- /Model/WindowHandle.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Runtime.InteropServices; 4 | using System.Windows; 5 | using System.Windows.Interop; 6 | 7 | namespace CADSnoop.Model 8 | { 9 | public static class WindowHandle 10 | { 11 | [DllImport("kernel32.dll")] 12 | public static extern uint GetCurrentThreadId(); 13 | 14 | /// 15 | /// Sets the given window's owner to Cad window. 16 | /// 17 | /// Target window. 18 | public static void SetCadAsWindowOwner(this Window dialog) 19 | { 20 | if (null == dialog) { return; } 21 | 22 | WindowInteropHelper helper = new WindowInteropHelper(dialog); 23 | helper.Owner = FindCadWindowHandle(); 24 | } 25 | 26 | /// 27 | /// Finds the Cad window handle. 28 | /// 29 | /// Revit window handle. 30 | public static IntPtr FindCadWindowHandle() 31 | { 32 | try 33 | { 34 | IntPtr foundRevitHandle = IntPtr.Zero; 35 | uint currentThreadID = GetCurrentThreadId(); 36 | 37 | // Search for the Revit process with current thread ID. 38 | Process[] revitProcesses = Process.GetProcessesByName("acad"); 39 | Process foundRevitProcess = null; 40 | foreach (Process aRevitProcess in revitProcesses) 41 | { 42 | foreach (ProcessThread aThread in aRevitProcess.Threads) 43 | { 44 | if (aThread.Id == currentThreadID) 45 | { 46 | foundRevitProcess = aRevitProcess; 47 | break; 48 | } 49 | } // For each thread in the process. 50 | 51 | // When we have found our Revit process, then stop searching. 52 | if (null != foundRevitProcess) { break; } 53 | } // For each revit process found 54 | 55 | if (null != foundRevitProcess) 56 | { 57 | foundRevitHandle = foundRevitProcess.MainWindowHandle; 58 | } 59 | 60 | return foundRevitHandle; 61 | } 62 | catch (Exception) 63 | { 64 | return IntPtr.Zero; 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /PackageContents.xml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 10 | 11 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Windows; 6 | 7 | // General Information about an assembly is controlled through the following 8 | // set of attributes. Change these attribute values to modify the information 9 | // associated with an assembly. 10 | [assembly: AssemblyTitle("SnooAutoCADCSharp")] 11 | [assembly: AssemblyDescription("")] 12 | [assembly: AssemblyConfiguration("")] 13 | [assembly: AssemblyCompany("HTL")] 14 | [assembly: AssemblyProduct("SnooAutoCADCSharp")] 15 | [assembly: AssemblyCopyright("Copyright © HTL 2020")] 16 | [assembly: AssemblyTrademark("")] 17 | [assembly: AssemblyCulture("")] 18 | 19 | // Setting ComVisible to false makes the types in this assembly not visible 20 | // to COM components. If you need to access a type in this assembly from 21 | // COM, set the ComVisible attribute to true on that type. 22 | [assembly: ComVisible(false)] 23 | 24 | //In order to begin building localizable applications, set 25 | //CultureYouAreCodingWith in your .csproj file 26 | //inside a . For example, if you are using US english 27 | //in your source files, set the to en-US. Then uncomment 28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 29 | //the line below to match the UICulture setting in the project file. 30 | 31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 32 | 33 | 34 | [assembly: ThemeInfo( 35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 36 | //(used if a resource is not found in the page, 37 | // or application resource dictionaries) 38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 39 | //(used if a resource is not found in the page, 40 | // app, or any theme specific resource dictionaries) 41 | )] 42 | 43 | 44 | // Version information for an assembly consists of the following four values: 45 | // 46 | // Major Version 47 | // Minor Version 48 | // Build Number 49 | // Revision 50 | // 51 | // You can specify all the values or you can default the Build and Revision Numbers 52 | // by using the '*' as shown below: 53 | // [assembly: AssemblyVersion("1.0.*")] 54 | [assembly: AssemblyVersion("1.0.0.0")] 55 | [assembly: AssemblyFileVersion("1.0.0.0")] 56 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SnoopAutoCADCSharp.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SnoopAutoCADCSharp.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SnoopAutoCADCSharp.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # AutoCADLookup 3 | 4 | ![Autocad API](https://img.shields.io/badge/Autocad%20API-2022-blue.svg) 5 | ![Platform](https://img.shields.io/badge/platform-Windows-lightgray.svg) 6 | ![.NET](https://img.shields.io/badge/.NET6-blue.svg) 7 | [![License](http://img.shields.io/:license-mit-blue.svg)](http://opensource.org/licenses/MIT) 8 | 9 | Interactive Autocad BIM database exploration tool to view and navigate element properties and relationships. 10 | 11 | ### Setup 12 | 13 | Open the SnoopAutoCADCSharp.sln on Visual Studio 2022. All references should be ready for AutoCAD 2022 default install path, otherwise go to project properties >> References, then click on Reference Paths and adjust. Build the project in Release, the DLL should be placed at same folder. Copy the entire .bundle folder to C:\Program Files\Autodesk\Autodesk\ApplicationPlugins folder and launch Autocad. 14 | 15 | ## Installation 16 | 17 | - Download last install stable(msi) from CadPythonShell [Release](https://github.com/chuongmep/CADPythonShell/releases/latest) 18 | - Use command `Snoop` to open Window or use button Snoop from Ribbon 19 | - See guide install detail at [How-to-Install-CadPythonShell](https://github.com/chuongmep/CadPythonShell/wiki/How-to-Install-CadPythonShell) 20 | 21 | Note : Support for 4 last version(2019-2022) Autocad or Civil 3D. Older versions can be used but will not guarantee the expected performance. 22 | 23 | # Usage 24 | 25 | - On AutoCAD , command the "Snoop" option, the main form should appear. At the left side is a list of the main collections on the active document. On the right side, the properties of the item selected on the left. 26 | 27 | - Can continue Snoop Database to check. 28 | 29 | ![](Documents/_Image_bfad9808-fa10-4857-8d77-f1f0b161433f.png) 30 | 31 | ### Author 32 | 33 | First Project write sypport Autocad and Civi3D with language VB.NET by Augusto Goncalves @augustomaia , member of the Autodesk Developer Technical Services team. 34 | 35 | Now project update in .NET C# by htlcnn and Hồ Văn Chương 36 | 37 | ### Known Issues 38 | 39 | The tool may stop working on some properties that cannot be reflected (using .NET). 40 | 41 | ### Demo 42 | 43 | ![](Documents/SnoopCad.gif) 44 | 45 | ### Release History 46 | 47 | 1.0.0 : First Release 48 | 49 | 50 | -------------------------------------------------------------------------------- /SnoopAutoCADCSharp.bundle/PackageContents.xml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 10 | 11 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /SnoopAutoCADCSharp.bundle/SnoopAutoCADCSharp.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htlcnn/AutoCADLookup/32944bd352e13d5276d8ed5039967e7472f77c59/SnoopAutoCADCSharp.bundle/SnoopAutoCADCSharp.dll -------------------------------------------------------------------------------- /SnoopAutoCADCSharp.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.2.32317.152 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CADSnoop", "CADSnoop.csproj", "{4AB3C6E6-D513-461D-BA9A-6F081E50323A}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {4AB3C6E6-D513-461D-BA9A-6F081E50323A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {4AB3C6E6-D513-461D-BA9A-6F081E50323A}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {4AB3C6E6-D513-461D-BA9A-6F081E50323A}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {4AB3C6E6-D513-461D-BA9A-6F081E50323A}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {7C89A58D-A042-49B9-8849-1DEF4397E06F} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /SnoopCommand.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Windows; 5 | using Autodesk.AutoCAD.ApplicationServices; 6 | using Autodesk.AutoCAD.DatabaseServices; 7 | using Autodesk.AutoCAD.EditorInput; 8 | using Autodesk.AutoCAD.Runtime; 9 | using CADSnoop.Model; 10 | using CADSnoop.View; 11 | using CADSnoop.ViewModel; 12 | using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application; 13 | using Exception = System.Exception; 14 | 15 | namespace CADSnoop 16 | { 17 | public class SnoopCommand 18 | { 19 | [CommandMethod("Snoop")] 20 | public void Snoop() 21 | { 22 | Snoop(new List()); 23 | } 24 | /// 25 | /// Snoop Snoop a object by id 26 | /// 27 | /// 28 | public void Snoop(ObjectId objectId) 29 | { 30 | Snoop(new List(){objectId}); 31 | } 32 | /// 33 | /// snoop by dbobject 34 | /// 35 | /// 36 | /// 37 | public void Snoop(DBObject dbObject) 38 | { 39 | if (dbObject == null) throw new ArgumentException(nameof(dbObject)); 40 | Document doc = Application.DocumentManager.MdiActiveDocument; 41 | Editor ed = doc.Editor; 42 | Database db = doc.Database; 43 | using (DocumentLock lockDoc = doc.LockDocument()) 44 | { 45 | using (Transaction tran = db.TransactionManager.StartTransaction()) 46 | { 47 | { 48 | SnoopViewModel vm = new SnoopViewModel(doc, db, dbObject); 49 | MainWindow form = new MainWindow(vm); 50 | form.SetCadAsWindowOwner(); 51 | form.Show(); 52 | } 53 | tran.Commit(); 54 | } 55 | } 56 | } 57 | /// 58 | /// Snoop snoop object by list object id 59 | /// 60 | /// 61 | public void Snoop(List objectIds) 62 | { 63 | try 64 | { 65 | Document doc = Application.DocumentManager.MdiActiveDocument; 66 | Editor ed = doc.Editor; 67 | Database db = doc.Database; 68 | using (DocumentLock lockDoc = doc.LockDocument()) 69 | { 70 | using (Transaction tran = db.TransactionManager.StartTransaction()) 71 | { 72 | if (objectIds == null || objectIds.Count==0) objectIds = PickObjectBySelect(doc); 73 | if (objectIds != null) 74 | { 75 | SnoopViewModel vm = new SnoopViewModel(doc, db, objectIds); 76 | MainWindow form = new MainWindow(vm); 77 | form.SetCadAsWindowOwner(); 78 | form.Show(); 79 | } 80 | tran.Commit(); 81 | } 82 | } 83 | } 84 | catch (Exception ex) 85 | { 86 | MessageBox.Show(ex.ToString()); 87 | } 88 | } 89 | List PickObjectBySelect(Document doc) 90 | { 91 | try 92 | { 93 | //PromptSelectionOptions poOptions = new PromptSelectionOptions(); 94 | //poOptions.SingleOnly = true; 95 | PromptSelectionResult promptSelectionResult = doc.Editor.GetSelection(); 96 | if (promptSelectionResult.Status != PromptStatus.OK) return null; 97 | SelectionSet selectionSet = promptSelectionResult.Value; 98 | return selectionSet.GetObjectIds().ToList(); 99 | } 100 | catch (ArgumentNullException) { } 101 | catch (NullReferenceException) { } 102 | catch (Exception e) 103 | { 104 | MessageBox.Show(e.ToString()); 105 | } 106 | 107 | return null; 108 | } 109 | 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /View/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  19 | 20 | 23 | 27 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 60 | 61 | 62 | 66 | 67 | 68 | 69 | 73 | 74 | 75 | 76 | 80 | 84 | 88 | 89 | 90 | 91 | 92 | 93 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /View/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Windows; 3 | using System.Windows.Controls; 4 | using System.Windows.Input; 5 | using Autodesk.AutoCAD.DatabaseServices; 6 | using CADSnoop.Model; 7 | using CADSnoop.ViewModel; 8 | using Exception = System.Exception; 9 | 10 | namespace CADSnoop.View 11 | { 12 | 13 | /// 14 | /// Interaction logic for MainWindow.xaml 15 | /// 16 | public partial class MainWindow : Window 17 | { 18 | private SnoopViewModel _viewModel; 19 | 20 | public MainWindow() 21 | { 22 | InitializeComponent(); 23 | } 24 | public MainWindow(SnoopViewModel vm) :this() 25 | { 26 | this._viewModel = vm; 27 | this.DataContext = vm; 28 | SnoopViewModel.FrmMain = this; 29 | } 30 | 31 | private void Treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) 32 | { 33 | try 34 | { 35 | 36 | TreeViewCustomItem selected = e.NewValue as TreeViewCustomItem; 37 | object obj = selected.Object; 38 | DBObject dbObject = obj as DBObject; 39 | if (dbObject != null) 40 | { 41 | foreach (KeyValuePair> pair in _viewModel.DataMethod) 42 | { 43 | if (pair.Key == dbObject.Id.ToString()) 44 | { 45 | _viewModel.LisViewItems = new List(); 46 | _viewModel.LisViewItems = pair.Value; 47 | } 48 | } 49 | 50 | _viewModel.UpdateDataSource(_viewModel.LisViewItems); 51 | } 52 | 53 | } 54 | catch (Exception ex) 55 | { 56 | MessageBox.Show(ex.InnerException.StackTrace); 57 | } 58 | } 59 | 60 | private void ListViewItem_DoubleClick(object sender, MouseButtonEventArgs e) 61 | { 62 | if (this.listview.SelectedItems.Count != 1) 63 | { 64 | return; 65 | } 66 | ObjectDetails selectedItem = this.listview.SelectedItem as ObjectDetails; 67 | object LinkObject = selectedItem.LinkObject; 68 | if (LinkObject is null) 69 | { 70 | return; 71 | } 72 | if (_viewModel.IsEnumerable(LinkObject)) 73 | { 74 | using (_viewModel.doc.LockDocument()) 75 | { 76 | _viewModel.CollectionItemSelected(LinkObject); 77 | } 78 | 79 | } 80 | else if (LinkObject is ObjectId objectId) 81 | { 82 | if (!IsExcept(objectId)) 83 | { 84 | using (_viewModel.doc.LockDocument()) 85 | { 86 | _viewModel.ObjectIdItemSelected(objectId); 87 | } 88 | } 89 | } 90 | } 91 | 92 | 93 | private void ContextMenu_MouseDown(object sender, RoutedEventArgs e) 94 | { 95 | MenuItem menuitem = sender as MenuItem; 96 | if (menuitem != null) 97 | { 98 | ContextMenu parent_contextmenu = menuitem.CommandParameter as ContextMenu; 99 | if (parent_contextmenu != null) 100 | { 101 | string clip = ""; 102 | foreach (var item in this.listview.SelectedItems) 103 | { 104 | ObjectDetails objectDetails = item as ObjectDetails; 105 | clip += objectDetails.PropName + "\t" + objectDetails.Type + "\t" + objectDetails.Value + "\n"; 106 | } 107 | Clipboard.SetText(clip); 108 | } 109 | } 110 | } 111 | 112 | private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 113 | { 114 | if (e.Key == Key.Escape) 115 | { 116 | Close(); 117 | } 118 | } 119 | 120 | 121 | bool IsExcept(ObjectId objectId) 122 | { 123 | if (objectId.IsNull) return true; 124 | if (objectId.ToString() == "0") return true; 125 | if (objectId.ToString() == "(0)") return true; 126 | return false; 127 | } 128 | 129 | private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 130 | { 131 | Close(); 132 | } 133 | } 134 | } 135 | 136 | -------------------------------------------------------------------------------- /ViewModel/SnoopViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Collections.Specialized; 5 | using System.ComponentModel; 6 | using System.Linq; 7 | using System.Reflection; 8 | using System.Windows; 9 | using System.Windows.Data; 10 | using Autodesk.AutoCAD.ApplicationServices; 11 | using Autodesk.AutoCAD.DatabaseServices; 12 | using Autodesk.AutoCAD.EditorInput; 13 | using CADSnoop.Model; 14 | using CADSnoop.View; 15 | using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application; 16 | using Exception = System.Exception; 17 | 18 | namespace CADSnoop.ViewModel 19 | { 20 | public class SnoopViewModel : ViewModelBase 21 | 22 | { 23 | private Dictionary> dataMethod; 24 | 25 | public Dictionary> DataMethod 26 | { 27 | get => dataMethod; 28 | set => dataMethod = value; 29 | } 30 | 31 | private const string stringEmpty = "[Empty]"; 32 | private const string stringEmptyCollection = "[Empty Collection]"; 33 | private const string stringCollection = "[Collection]"; 34 | public Editor Ed; 35 | public Document doc; 36 | public Database Database; 37 | public static MainWindow FrmMain; 38 | 39 | public List ObjectIds; 40 | 41 | private List listviewitems; 42 | 43 | public List LisViewItems 44 | { 45 | get 46 | { 47 | if (listviewitems == null) 48 | { 49 | listviewitems = new List(); 50 | } 51 | return listviewitems; 52 | } 53 | set => OnPropertyChanged(ref listviewitems, value); 54 | } 55 | 56 | private List treeViewItems; 57 | 58 | public List TreeViewItems 59 | { 60 | get 61 | { 62 | if (treeViewItems == null) 63 | { 64 | treeViewItems = new List(); 65 | } 66 | return treeViewItems; 67 | } 68 | set => OnPropertyChanged(ref treeViewItems, value); 69 | } 70 | 71 | public SnoopViewModel(Document doc, Database db) 72 | { 73 | this.doc = doc; 74 | this.Ed = doc.Editor; 75 | this.Database = db; 76 | this.dataMethod = new Dictionary>(); 77 | 78 | } 79 | /// 80 | /// Base Model 81 | /// 82 | /// 83 | /// 84 | public SnoopViewModel(Document doc, Database db, List objectIds) : this(doc,db) 85 | { 86 | this.ObjectIds = objectIds; 87 | GetListViewItem(); 88 | } 89 | 90 | public SnoopViewModel(Document doc, Database db, DBObject dbObject) :this(doc,db) 91 | { 92 | this.ObjectIds = new List(){ dbObject.Id}; 93 | GetListViewItem(); 94 | } 95 | /// 96 | /// Get list item of object 97 | /// 98 | void GetListViewItem() 99 | { 100 | try 101 | { 102 | listviewitems = new List(); 103 | Transaction tran = Database.TransactionManager.StartTransaction(); 104 | UpdateDataSource(listviewitems); 105 | if (ObjectIds.Any()) 106 | { 107 | foreach (ObjectId objectId in ObjectIds) 108 | { 109 | DBObject obj = tran.GetObject(objectId, OpenMode.ForWrite, true); 110 | AddToTreeView(obj); 111 | ListObjectInformation(obj); 112 | 113 | } 114 | } 115 | 116 | tran.Commit(); 117 | } 118 | catch (Exception e) 119 | { 120 | MessageBox.Show(e.ToString()); 121 | } 122 | } 123 | 124 | /// 125 | /// Update Source Tree By Group Name 126 | /// 127 | /// 128 | public void UpdateDataSource(List Items) 129 | { 130 | ICollectionView view = CollectionViewSource.GetDefaultView(Items); 131 | view.GroupDescriptions.Clear(); 132 | PropertyGroupDescription groupDescription = new PropertyGroupDescription("GroupName"); 133 | view.GroupDescriptions.Add(groupDescription); 134 | view.Refresh(); 135 | } 136 | 137 | /// 138 | /// Add Data object to tree view 139 | /// 140 | /// 141 | public void AddToTreeView(DBObject obj) 142 | { 143 | try 144 | { 145 | string text = GetNameOrType(obj) + " " + obj.ObjectId; 146 | TreeViewCustomItem item = new TreeViewCustomItem() { Title = text, Object = obj }; 147 | TreeViewItems.Add(item); 148 | } 149 | catch (Exception e) 150 | { 151 | MessageBox.Show(e.ToString()); 152 | } 153 | } 154 | 155 | private string GetNameOrType(object obj) 156 | { 157 | PropertyInfo propName = obj.GetType().GetProperty("Name"); 158 | if (propName != null && propName.CanRead) 159 | return propName.GetValue(obj).ToString(); 160 | else 161 | return obj.GetType().Name; 162 | } 163 | 164 | public void ListObjectInformation(DBObject obj) 165 | { 166 | try 167 | { 168 | LisViewItems.Clear(); 169 | Type objType = obj.GetType(); 170 | ListProperties(obj, objType); 171 | ListMethods(obj, objType); 172 | dataMethod.Add(obj.Id.ToString(), new List(listviewitems)); 173 | ICollectionView view = CollectionViewSource.GetDefaultView(listviewitems); 174 | view.Refresh(); 175 | } 176 | catch (Exception e) 177 | { 178 | MessageBox.Show(e.ToString()); 179 | } 180 | } 181 | 182 | /// 183 | /// Get all properties objects 184 | /// 185 | /// 186 | /// 187 | public void ListProperties(object obj, Type objType) 188 | { 189 | PropertyInfo[] properties = objType.GetProperties(); 190 | foreach (PropertyInfo prop in properties) 191 | { 192 | if ((IsBanned(objType, prop.Name))) 193 | continue; 194 | 195 | string propName = prop.Name; 196 | string propType = prop.PropertyType.Name; 197 | string propValue = GetValueAsString(prop, obj); 198 | object LinkObject = GetValue(prop, obj); 199 | listviewitems.Add(new ObjectDetails() 200 | { 201 | GroupName = prop.DeclaringType.FullName, 202 | PropName = propName, 203 | Type = propType, 204 | Value = propValue, 205 | LinkObject = LinkObject 206 | }); 207 | 208 | } 209 | } 210 | 211 | /// 212 | /// Get Value of method object 213 | /// 214 | /// 215 | /// 216 | /// 217 | private object GetValue(MethodInfo method, object obj) 218 | { 219 | object methodValue = null; 220 | try 221 | { 222 | methodValue = method.Invoke(obj, null); 223 | } 224 | catch 225 | { 226 | } 227 | 228 | if ((methodValue != null)) 229 | return methodValue; 230 | return stringEmpty; 231 | } 232 | 233 | private object GetValue(PropertyInfo prop, object obj) 234 | { 235 | object propValue = null; 236 | try 237 | { 238 | propValue = prop.GetValue(obj, null); 239 | } 240 | catch 241 | { 242 | } 243 | 244 | if ((propValue != null)) 245 | return propValue; 246 | return stringEmpty; 247 | } 248 | 249 | private StringCollection _bannedList = new StringCollection(); 250 | 251 | /// 252 | /// Check Tree View Is Expanded 253 | /// 254 | /// 255 | /// 256 | /// 257 | private bool IsBanned(Type objectType, string propName) 258 | { 259 | return (_bannedList.Contains($"{objectType.Name}_{propName}")); 260 | } 261 | 262 | 263 | /// 264 | /// Get All Method Object Name 265 | /// 266 | /// 267 | /// 268 | public void ListMethods(object obj, Type objType) 269 | { 270 | try 271 | { 272 | MethodInfo[] methods = objType.GetMethods(); 273 | foreach (MethodInfo meth in methods) 274 | { 275 | if (meth.Name.Contains("Reactor")) 276 | continue; // skip some unwanted methods... 277 | if ((meth.GetParameters().Length == 0 & !meth.IsSpecialName & meth.ReturnType != typeof(void))) 278 | { 279 | object methodValue = GetValue(meth, obj); 280 | if ((IsEnumerable(methodValue))) 281 | { 282 | string propName = meth.Name; 283 | string propType = meth.ReturnType.Name; 284 | string propValue = stringCollection; 285 | object LinkObject = GetValue(meth, obj); 286 | listviewitems.Add(new ObjectDetails() 287 | { 288 | GroupName = meth.DeclaringType.FullName, 289 | PropName = propName, 290 | Type = propType, 291 | Value = propValue, 292 | LinkObject = LinkObject 293 | }); 294 | } 295 | } 296 | } 297 | } 298 | catch (Exception) 299 | { 300 | // ignored 301 | } 302 | } 303 | 304 | public bool IsEnumerable(object obj) 305 | { 306 | string asString = obj as string; 307 | if ((asString != null)) 308 | return false; // strings are enumerable, but not collections 309 | IEnumerable asEnum = obj as IEnumerable; 310 | return (asEnum != null); 311 | } 312 | 313 | /// 314 | /// Get Value Object 315 | /// 316 | /// 317 | /// 318 | /// 319 | private string GetValueAsString(PropertyInfo prop, object obj) 320 | { 321 | object propValue = null; 322 | try 323 | { 324 | if (!(prop.CanRead)) 325 | return "[Write-only]"; 326 | 327 | propValue = prop.GetValue(obj, null); 328 | if (IsEnumerable(propValue)) 329 | { 330 | IEnumerable asEnum = propValue as IEnumerable; 331 | foreach (object item in asEnum) 332 | return stringCollection; // at least one, ok 333 | return stringEmptyCollection; // empty collection then 334 | } 335 | } 336 | catch 337 | { 338 | // ignored 339 | } 340 | 341 | if ((propValue != null)) 342 | return propValue.ToString(); 343 | return stringEmpty; 344 | } 345 | 346 | /// 347 | /// Get Info Selected Object 348 | /// 349 | /// 350 | public void ObjectIdItemSelected(object LinkObject) 351 | { 352 | List objectIds = new List(); 353 | objectIds.Add((ObjectId)LinkObject); 354 | try 355 | { 356 | SnoopViewModel viewModel = new SnoopViewModel(doc, Database, objectIds); 357 | MainWindow form = new MainWindow(viewModel); 358 | Application.ShowModalWindow(FrmMain.Owner, form); 359 | } 360 | catch (Exception ex) 361 | { 362 | MessageBox.Show(ex.ToString()); 363 | } 364 | 365 | } 366 | 367 | /// 368 | /// Get Info Item Select Object 369 | /// 370 | /// 371 | public void CollectionItemSelected(object LinkObject) 372 | { 373 | List objectIds = new List(); 374 | 375 | foreach (var item in (IEnumerable)LinkObject) 376 | { 377 | if (item is ObjectId) 378 | { 379 | objectIds.Add((ObjectId)item); 380 | } 381 | } 382 | 383 | if (objectIds.Count > 0) 384 | { 385 | try 386 | { 387 | SnoopViewModel vm = new SnoopViewModel(doc, Database, objectIds); 388 | MainWindow form = new MainWindow(vm); 389 | form.WindowStartupLocation = WindowStartupLocation.Manual; 390 | Application.ShowModalWindow(form); 391 | } 392 | catch (Exception ex) 393 | { 394 | MessageBox.Show(ex.Message); 395 | } 396 | } 397 | else 398 | { 399 | MessageBox.Show("No ObjectId inside this Collection"); 400 | } 401 | } 402 | } 403 | } 404 | -------------------------------------------------------------------------------- /ViewModel/TreeViewCustom.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using Autodesk.AutoCAD.DatabaseServices; 3 | 4 | namespace CADSnoop.ViewModel 5 | { 6 | public class TreeViewCustomItem 7 | { 8 | public TreeViewCustomItem() 9 | { 10 | this.ChildItems = new ObservableCollection(); 11 | } 12 | 13 | public string Title { get; set; } 14 | public DBObject Object { get; set; } 15 | public ObservableCollection ChildItems { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /inno_setup/Installer.iss: -------------------------------------------------------------------------------- 1 | ; Script generated by the Inno Setup Script Wizard. 2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3 | 4 | #define MyAppName "SnoopAutoCADCSharp" 5 | #define MyAppVersion "1.0.20200312" 6 | #define MyAppPublisher "HTL" 7 | #define MyAppURL "http://bimudic.com" 8 | #define BundleDirName "C:\ProgramData\Autodesk\ApplicationPlugins\SnoopAutoCADCSharp.bundle" 9 | 10 | [Setup] 11 | ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. 12 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 13 | AppId={{9183A073-C1BF-4EF4-B4F9-45E85C22C28E}} 14 | AppName={#MyAppName} 15 | AppVersion={#MyAppVersion} 16 | ;AppVerName={#MyAppName} {#MyAppVersion} 17 | AppPublisher={#MyAppPublisher} 18 | AppPublisherURL={#MyAppURL} 19 | AppSupportURL={#MyAppURL} 20 | AppUpdatesURL={#MyAppURL} 21 | DefaultDirName={autopf}\{#MyAppName} 22 | DisableDirPage=yes 23 | DefaultGroupName={#MyAppName} 24 | DisableProgramGroupPage=yes 25 | ; Uncomment the following line to run in non administrative install mode (install for current user only.) 26 | ;PrivilegesRequired=lowest 27 | OutputBaseFilename="SnoopAutoCADCSharp setup" 28 | Compression=lzma 29 | SolidCompression=yes 30 | WizardStyle=modern 31 | 32 | [Languages] 33 | Name: "english"; MessagesFile: "compiler:Default.isl" 34 | 35 | [Files] 36 | ; Source: "C:\Program Files (x86)\Inno Setup 6\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion 37 | Source: "..\PackageContents.xml"; DestDir: "{#BundleDirName}"; Flags: ignoreversion 38 | Source: "..\bin\Release\SnoopAutoCADCSharp.dll"; DestDir: "{#BundleDirName}"; Flags: ignoreversion 39 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 40 | 41 | [Icons] 42 | Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" 43 | 44 | -------------------------------------------------------------------------------- /inno_setup/Output/SnoopAutoCADCSharp setup.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htlcnn/AutoCADLookup/32944bd352e13d5276d8ed5039967e7472f77c59/inno_setup/Output/SnoopAutoCADCSharp setup.exe --------------------------------------------------------------------------------