Author Topic: Open new dwg ( conversion from lisp )  (Read 3066 times)

0 Members and 1 Guest are viewing this topic.

Mark

  • Custom Title
  • Seagull
  • Posts: 28762
Open new dwg ( conversion from lisp )
« on: September 15, 2005, 10:52:40 AM »
Can someone convert this lisp into VBA? I just want to see how it works.
Code: [Select]
(defun c:openC ( / cur_dir fo )
  ;; open a dwg from the dir of the current dwg
  (setq cur_dir (getvar "dwgprefix")); path

  (if (setq fo (getfiled "Open Drawing" cur_dir "dwg" 8))
    (command "vbastmt"
             (strcat
               "AcadApplication.Documents.Open"
               (chr 34)cur_dir fo(chr 34)", false"
               )
             )
    )
  (princ)
  )
Thanks
TheSwamp.org  (serving the CAD community since 2003)

Murphy

  • Guest
Re: Open new dwg ( conversion from lisp )
« Reply #1 on: September 15, 2005, 11:05:40 AM »
This goes in class modules called FILEDIALOG
Code: [Select]

Option Explicit

'//The Win32 API Functions///
Private Declare Function GetSaveFileName Lib _
"comdlg32.dll" Alias "GetSaveFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

Private Declare Function GetOpenFileName Lib _
"comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

'//A few of the available Flags///
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_ALLOWMULTISELECT = &H200
'This one keeps your dialog from turning into
'A browse by folder dialog if multiselect is true!
'Not sure what I mean? Remove it from the flags
'In the "Show Open" & "Show Save" methods.
Private Const OFN_EXPLORER As Long = &H80000
'//The Structure
Private Type OPENFILENAME
  lStructSize As Long
  hwndOwner As Long
  hInstance As Long
  lpstrFilter As String
  lpstrCustomFilter As String
  nMaxCustFilter As Long
  nFilterIndex As Long
  lpstrFile As String
  nMaxFile As Long
  lpstrFileTitle As String
  nMaxFileTitle As Long
  lpstrInitialDir As String
  lpstrTitle As String
  flags As Long
  nFileOffset As Integer
  nFileExtension As Integer
  lpstrDefExt As String
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As String
End Type

Private lngHwnd As Long
Private strFilter As String
Private strTitle As String
Private strDir As String
Private blnHideReadOnly As Boolean
Private blnAllowMulti As Boolean
Private blnMustExist As Boolean

Public Property Let HideReadOnly(blnVal As Boolean)
 'Simple one
 blnHideReadOnly = blnVal
End Property

Public Property Get HideReadOnly() As Boolean
 HideReadOnly = blnHideReadOnly
End Property

Private Sub Class_Initialize()
  'Set default values when
  'class is first created
  strDir = CurDir
  strTitle = "The Thomas Group"
  strFilter = "All Files" _
  & Chr$(0) & "*.*" & Chr$(0)
  lngHwnd = FindWindow(vbNullString, Application.Caption)
  'None of the flags are set here!
End Sub

Public Property Let OwnerHwnd(WindowHandle As Long)
  '//FOR YOU TODO//
  'Use the API to validate this handle
  lngHwnd = WindowHandle
  'This value is set at startup to the handle of the
  'AutoCAD Application window, if you want the owner
  'to be a user form you will need to obtain its
  'Handle by using the "FindUserForm" function in
  'This class.
End Property

Public Property Get OwnerHwnd() As Long
  OwnerHwnd = lngHwnd
End Property

Public Property Let Title(Caption As String)
  'don't allow null strings
  If Not Caption = vbNullString Then
    strTitle = Caption
  End If
End Property

Public Property Get Title() As String
  Title = strTitle
End Property

Public Property Let Filter(ByVal FilterString As String)
  'Filters change the type of files that are
  'displayed in the dialog. I have designed this
  'validation to use the same filter format the
  'Common dialog OCX uses:
  '"All Files (*.*)|*.*"
  Dim intPos As Integer
  Do While InStr(FilterString, "|") > 0
    intPos = InStr(FilterString, "|")
    If intPos > 0 Then
      FilterString = Left$(FilterString, intPos - 1) _
      & Chr$(0) & Right$(FilterString, _
      Len(FilterString) - intPos)
    End If
  Loop
  If Right$(FilterString, 2) <> Chr$(0) & Chr$(0) Then
    FilterString = FilterString & Chr$(0)
  End If
  strFilter = FilterString
End Property

Public Property Get Filter() As String
  'Here we reverse the process and return
  'the Filter in the same format the it was
  'entered
  Dim intPos As Integer
  Dim strTemp As String
  strTemp = strFilter
  Do While InStr(strTemp, Chr$(0)) > 0
    intPos = InStr(strTemp, Chr$(0))
    If intPos > 0 Then
      strTemp = Left$(strTemp, intPos - 1) _
      & "|" & Right$(strTemp, _
      Len(strTemp) - intPos)
    End If
  Loop
  If Right$(strTemp, 1) = "|" Then
    strTemp = Left$(strTemp, Len(strTemp) - 1)
  End If
  Filter = strTemp
End Property

Public Property Let InitialDir(strFolder As String)
'Sets the directory the dialog displays when called
  If Len(Dir(strFolder)) > 0 Then
    strDir = strFolder
  Else
    Err.Raise 514, "FileDialog", "Invalid Initial Directory"
  End If
End Property

Public Property Let MultiSelect(blnVal As Boolean)
'allow users to select more than one file using
'The Shift or CTRL keys during selection
  blnAllowMulti = blnVal
End Property

Public Property Let FileMustExist(blnVal As Boolean)
  blnMustExist = blnVal
End Property

'@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@
' Display and use the File open dialog
'@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@
Public Function ShowOpen() As String
  Dim strTemp As String
  Dim udtStruct As OPENFILENAME
  udtStruct.lStructSize = Len(udtStruct)
  'Use our private variable
  udtStruct.hwndOwner = lngHwnd
  'Use our private variable
  udtStruct.lpstrFilter = strFilter
  udtStruct.lpstrFile = Space$(4999)
  udtStruct.nMaxFile = 5000
  udtStruct.lpstrFileTitle = Space$(254)
  udtStruct.nMaxFileTitle = 255
  'Use our private variable
  udtStruct.lpstrInitialDir = strDir
  'Use our private variable
  udtStruct.lpstrTitle = strTitle
  'Ok, here we test our booleans to
  'set the flag
  If blnHideReadOnly And blnAllowMulti And blnMustExist Then
    udtStruct.flags = OFN_HIDEREADONLY Or _
    OFN_ALLOWMULTISELECT Or OFN_EXPLORER Or OFN_FILEMUSTEXIST
  ElseIf blnHideReadOnly And blnAllowMulti Then
    udtStruct.flags = OFN_ALLOWMULTISELECT _
    Or OFN_EXPLORER Or OFN_HIDEREADONLY
  ElseIf blnHideReadOnly And blnMustExist Then
    udtStruct.flags = OFN_HIDEREADONLY Or OFN_FILEMUSTEXIST
  ElseIf blnAllowMulti And blnMustExist Then
    udtStruct.flags = OFN_ALLOWMULTISELECT Or _
    OFN_EXPLORER Or OFN_FILEMUSTEXIST
  ElseIf blnHideReadOnly Then
    udtStruct.flags = OFN_HIDEREADONLY
  ElseIf blnAllowMulti Then
    udtStruct.flags = OFN_ALLOWMULTISELECT _
    Or OFN_EXPLORER
  ElseIf blnMustExist Then
    udtStruct.flags = OFN_FILEMUSTEXIST
  End If
  If GetOpenFileName(udtStruct) Then
    strTemp = (Trim(udtStruct.lpstrFile))
    ShowOpen = Mid(strTemp, 1, Len(strTemp) - 1)
  End If
End Function

'@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@
' Display and use the File Save dialog
'@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@
Public Function ShowSave() As String
  Dim strTemp As String
  Dim udtStruct As OPENFILENAME
  udtStruct.lStructSize = Len(udtStruct)
  'Use our private variable
  udtStruct.hwndOwner = lngHwnd
  'Use our private variable
  udtStruct.lpstrFilter = strFilter
  udtStruct.lpstrFile = Space$(5000)
  udtStruct.nMaxFile = 5000
  udtStruct.lpstrFileTitle = Space$(254)
  udtStruct.nMaxFileTitle = 255
  'Use our private variable
  udtStruct.lpstrInitialDir = strDir
  'Use our private variable
  udtStruct.lpstrTitle = strTitle
  If blnMustExist Then
    udtStruct.flags = OFN_FILEMUSTEXIST
  End If
  If GetSaveFileName(udtStruct) Then
    strTemp = (Trim(udtStruct.lpstrFile))
    ShowSave = Mid(strTemp, 1, Len(strTemp) - 1)
  End If
End Function

This goes in the module.
Code: [Select]
Public Sub OpenLinkedDwg_Update()
Dim strFile As String
Dim objFD As New FILEDIALOG
Dim intType(0) As Integer
Dim varData(0) As Variant
Dim varDatType As Variant
Dim varDatVal As Variant
Dim objText As AcadText
Dim objMText As AcadMText
Dim objcell As Range
Dim strAddress As String
Dim strVal As String
Dim intCnt As Integer
On Error GoTo Err_Handler
objFD.Filter = "AutoCAD Drawings (*.dwg)|*.dwg"
objFD.HideReadOnly = True
objFD.Title = "Drawing to open"
strFile = objFD.ShowOpen
If Len(Dir(strFile)) > 0 Then
 AcadApplication.Documents.Open strFile, False
End If
Exit_Here:
    Exit Sub
Err_Handler:
  MsgBox Err.Number & Err.Description, vbOKOnly, "Uh Oh!"
End Sub

Keith™

  • Villiage Idiot
  • Seagull
  • Posts: 16899
  • Superior Stupidity at its best
Re: Open new dwg ( conversion from lisp )
« Reply #2 on: September 15, 2005, 11:08:52 AM »
OOOOooo that is alot of code for an open file dialog ....
Proud provider of opinion and arrogance since November 22, 2003 at 09:35:31 am
CadJockey Militia Field Marshal

Find me on https://parler.com @kblackie