yoin

WebRacer

hoi, in topic http://www.cadsite.be/forum/viewtopic.php?t=194 waarin Joop een schijnbaar schitterende lisp routine van David Stein laat zien, worden er vooral veel mogelijkheden meegegeven, waarmee je dus vanuit autocad excel zou moeten kunnen manipuleren.

De laatste 2 uur heb ik mij daar eens zitten in verdiepen en het een en ander uitspitten, maar ik word er helaas niet echt wijzer van, is er iemand die dit ook gedaan heeft (uitspitten en verdiepen) en die mij enige uitleg hieromtrend kan meegeven, vooral dan van hoe je al die subroutines moet gebruiken, of je ze allemaal moet doorlopen ja dan nee, en natuurlijk, hoe je ze gebruikt.

Ik ken wel een en ander van autocad, en helaas veel te weinig van excel, maar toch zie ik enkele leuke en interresante mogelijkheden om deze 2 aangenaam te koppellen...

Alvast bedankt op voorhand.
?

Dnereb

Voor dat soort handelingen leent VB(A) zich echt beter als Autocad.
vooral omdat Excel ook VB(A) ondersteunt en direct is aan te sturen

Overigens moet ik er bij zeggen dat heel vaak dingen naar Excel gestuurd worden die eigenlijk in Access thuishoren.

dit is een stukje code om in een class module te zetten:

Option Explicit

'Author B.J.G. Nieuwhof.
'info@driesign.nl


Public Enum AppState
   OpenApp = 0
   CloseApp = 1
End Enum


Function ConnectToExcel(ByRef ExcelApp As Object, Action As AppState) As Boolean

Dim DocCount As Long

Static WasOpen As Boolean       'Flag to check if acad was already open before calling this function
Static OpeningCalls As Long     'Counter to keep track of number opening calls

If Action = OpenApp Then OpeningCalls = OpeningCalls + 1

ConnectToExcel = False

If Action = OpenApp Then
   On Error Resume Next
   Set ExcelApp = GetObject(, "Excel.Application")
   If Err Then
       Err.Clear
       If OpeningCalls = 1 Then
           WasOpen = False
       End If
       Set ExcelApp = CreateObject("Excel.Application")
       If Err Then
           MsgBox "Error number: " & Err.Number & " " & Err.Description & "Occured in Function ConnectToAcad."
           Exit Function
       End If
   ElseIf OpeningCalls = 1 Then
       WasOpen = True
   End If
   On Error GoTo 0
   ConnectToExcel = True

ElseIf Not WasOpen And IsObject(ExcelApp) Then ' make sure acad is an object and not empty
   
   ExcelApp.Quit
   Set ExcelApp = Nothing
   ConnectToExcel = True
   WasOpen = False
   OpeningCalls = 0                                    'reset opening calls
End If


End Function


'Test sub to prove it works
'run this while you haven't opened Excel and it will close it again
'run this while Excel is open and it wil not close it at the end.

Sub test()

Dim ExcelInstance As Object
Dim ClsExcel As New ConnectToExcel

If ConnectToExcel(ExcelInstance, OpenApp) Then
   MsgBox "Open!"
   ExcelInstance.Visible = True         'just to show you can manipulate Excel anyways.
   If ConnectToExcel(ExcelInstance, CloseApp) Then
       MsgBox "Closed!"
   End If
End If

End Sub



Private Sub Class_Terminate()

If OpeningCalls > 0 And Not WasOpen And IsObject(ExcelApp) Then ' make sure acad is an object and not empty
   
   ExcelApp.Quit
   Set ExcelApp = Nothing
   ConnectToExcel = True
   WasOpen = False
   OpeningCalls = 0                                    'reset opening calls
End If

End Sub


En hiermee kan je het in een gewone VB(A) form/module gebruiken:

Sub TestExcel()


'Test sub to prove it works
'run this while you haven't opened Excel and it will close it again
'run this while Excel is open and it wil not close it at the end.


Dim ExcelInstance As Object
Dim ClsExcel As New ClsOpenExcel
If ClsExcel.ConnectToExcel(ExcelInstance, OpenApp) Then
   MsgBox "Open!"
   ExcelInstance.Visible = True         'just to show you can manipulate Excel anyways.
   If ClsExcel.ConnectToExcel(ExcelInstance, CloseApp) Then
       MsgBox "Closed!"
   End If
End If


End Sub



Mijn Excuus voor het Engels maar ik be gewend om in het engels te schrijven en commentaren in mijn code te zetten zodat ik  ook op engelse fora vragen kan stellen.

HofCAD

Citaat van: DnerebVoor dat soort handelingen leent VB(A) zich echt beter als Autocad.


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer,

    Soms is het maar betrekkelijk, dat VBA zich er beter voor leent
    dan AutoLISP.
    Meestal kan ik met Visual Lisp hetzelfde en veel sneller programeren
    dan met VBA.
    Misschien speelt ook wel een rol, waar je goed in bent.

    Heb je dit al gezien:
    http://www.cadsite.be/forum/viewtopic.php?t=399&highlight=hofcad

    Als ik vanavond tijd heb, zal ik kleurtjes maken in Excel.

    Groetjes HofCAD CSI
ACADcadabra

Dnereb

Ja, ja daar had (V)Lisp moeten staan.

Maar ik blijf erbij dat VBA zich beter leent voor Excel of andere office Apps gebruiken vanuit Acad.

een cel een kleurtje geven :ExcellApp.ActiveSheet.Cells(X,Y).Interior.colorindex = vbRed(niet getest en variable  X en Y bepalen de kolom en Rij )
Daarbij is VB(A) object georienteerd en als je de klasse gebruikt zoals ik hem gepost hebt wordt b.v. gegarandeerd de excell applicatie afgesloten zelfs als de macro onverwacht onderbroken word.
Ik ben gelukkig ' illisperate' maar ik betwijfel of dat mogelijk is in (((L)ost) ((I)n) ((S)tupid) ((P)arenteteeth))

WebRacer

Beste Dnereb,

Dat VBA (
Verdomd Bullshit en meestal Ambetant.... in mijn ogen)
meer kan dan Lisp en/of Vlisp dat is een feit, omdat het universeler is van programeertaal.

Mag ik er u echter op wijzen dat LISP de enige taal was waar je je vroeger mee kon behelpen in autocad, en nu met Vlisp eigenlijk heel aardig kan tippen aan VBA4CAD...

In VBA weet ik echter wat te doen om naar excel te schrijven en/of lezen.

Het is mij om de uitdaging te doen om dit echter via Vlisp te doen, daar ik ook een vermoeden heb dat dit meer mogelijkheden biedt voor mijn bestaande programma's... en dat zijn er al een heel pak.


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Ik heb, Hofcad, die excel-subroutines bekeken, maar vind echter de logica niet ...
Ik vermoed dat je eerst excel moet zoeken, laden, nieuwe sheet openen, en dan de elementen uit een lijst naar de cellen schrijven...
dus eigenlijk:


(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)


met die verstande dat je dsx.lsp geladen hebt met die excel-subroutines
Dit lukt echter niet bij mij, vermoedelijk omdat bij de laatste uit de rij gebruik word gemaakt van een variable 'range'...

Dus eigenlijk komt het neer op: Hoe moet ik die subroutines nu gebruiken om elementen uit een lijst naar excel te schrijven...
?

HofCAD

Citaat van: WebRacer
(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)




----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer,

    Ik heb nog geen tijd gehad.

    Groetjes HofCAD CSI

    PS Probeer:

    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span   (strcat   "B5:"
                (chr
                  (+ 64 (length '("A" "B" "C")))
                )
                "20"
             )
           rang1   (vlax-get-property xlapp "Range" span)
           rang1s   (vlax-invoke-method rang1 "Select")
           rang1x   (vlax-get-property xlapp "Selection")
           rang1f   (vlax-get-property rang1x "Font")
           rang1i   (vlax-get-property rang1x "Interior")
           rang1a   (vlax-get-property rang1x "areas")
           rangE   RANG1
          )
    (DSX-Excel-Put-RowList '("A" "B" "C") 2 1)
    (foreach prop
              (list
                (list "ColorIndex" 35) ;-4105=msxl-xlAutomatic
                (list "pattern" 18 )
                (list "PatternColor" 255)
                (list "PatternColorIndex" 3)
              )
            (vlax-put-property rang1i (car prop) (cadr prop))
          )            ; foreach
    (DSX-Excel-Put-CellColor 1 5 14)
ACADcadabra

Dnereb

Citaat van: WebRacerBeste Dnereb,

Dat VBA (
Verdomd Bullshit en meestal Ambetant.... in mijn ogen)
meer kan dan Lisp en/of Vlisp dat is een feit, omdat het universeler is van programeertaal.

Mag ik er u echter op wijzen dat LISP de enige taal was waar je je vroeger mee kon behelpen in autocad, en nu met Vlisp eigenlijk heel aardig kan tippen aan VBA4CAD...


Ambetant???? :lol:
Als jij je thuis voelt in (V)Lisp moet je dat vooral gebruiken maar sommige dingen gaan nu eenmaal beter in bepaalde talen.
Lisp is vaak beter in selectie's maken  en manipulatie binnen Acad, terwijl VBA toch wat prettiger werkt met formulieren, Office Apps of andere taken die buiten Acad geschieden SQL Server lezen/schrijven b.v.

En eerlijk gezegd is OOP (Object Oriented Programing) of OBP (Object Based Programming) toch wat overzichtelijker als (V)Lisp en zal in de toekomst steeds normaler worden. denk maar eens aan VB.NET C.NET

WebRacer

tja, ik ben wel Cad-minded... en sta nog niet zo open voor VBA, op de meeste gebieden, al gebruik ik VBA ook wel hier en daar...

Met alle respect Dnereb, ik ga hier niet al mijn lisp-routines aanpassen voor enkele 'nuttigere' zaakjes... dat is pas onbegonnen werk...
?

Dnereb

Als je nog even wacht wordt het VBA.net VB en VBA worden inmiddels al uitgefaseerd. O tip lees eens wat achterstevoren :wink:

WebRacer

Nog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...
?

HofCAD

Citaat van: WebRacerNog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer

    Nog geen tijd gehad.

    Groetjes HofCAD CSI
ACADcadabra

HofCAD

Citaat van: WebRacerNog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer


    Heb je wel:

    (defun dsx-princ(s)
    (princ s))


    aangemaakt?

    Lukt het dan met het onderstaande ook niet.

    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span (strcat "B5:"
    (chr
    (+ 64 (length '("A" "B" "C")))
    )
    "20"
    )
    rang1 (vlax-get-property xlapp "Range" span)
    rang1s (vlax-invoke-method rang1 "Select")
    rang1x (vlax-get-property xlapp "Selection")
    rang1f (vlax-get-property rang1x "Font")
    rang1i (vlax-get-property rang1x "Interior")
    rang1a (vlax-get-property rang1x "areas")
    rangE RANG1
    )
    (DSX-Excel-Put-RowList '("A" "B" "C") 2 1)
    (foreach prop
    (list
    (list "ColorIndex" 35) ;-4105=msxl-xlAutomatic
    (list "pattern" 18 )
    (list "PatternColor" 255)
    (list "PatternColorIndex" 3)
    )
    (vlax-put-property rang1i (car prop) (cadr prop))
    ) ; foreach
    (DSX-Excel-Put-CellColor 1 5 14)


    Je moet de applicatie Excel op dezelfde manier beschouwen en
    onderzoeken als AutoCAD.


    (setq AutoCAD (vlax-get-acad-object))
    (vlax-dump-object AutoCAD T)
    (setq Pref (vla-get-Preferences AutoCAD))
    (vlax-dump-object Pref T)
    (setq Screen (vla-get-Display Pref))
    (vlax-dump-object Screen T)
    (setq Doc (vla-get-ActiveDocument AutoCAD))
    (vlax-dump-object Doc T)


    (setq dmsx (vlax-dump-object xlapp T))
    (setq wbs (vlax-get-property xlapp 'Workbooks))
    (vlax-dump-object wbs T)
    (setq awb (vlax-get-property xlapp "ActiveWorkbook"))
    (vlax-dump-object awb T)
    (setq aws (vlax-get-property xlapp "ActiveSheet"))
    (vlax-dump-object aws T)


    De bibliotheek bevat inderdaad relatieve verwijzingen na de range vlaobjecten.
    Waarom de celverwijzing in de bibliotheek relatief t.o.v. de range
    genomen is, daar is het nut bij mij nog niet gebleken.

    Groetjes HofCAD CSI
ACADcadabra

HofCAD

Citaat van: WebRacerIk heb een lijst, X_lst genaamt een variabele met een volledige lijst in van lijsten bv: (("1" "2" "3")("4" "5" "6")("7" "8" "9"))
ik wil met de dsx subroutines die lijst in cellen A1->C1 en tot A3 -> C3 ingevuld zien,


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer

    Bedoel je zoiets als onderstaand?

    Groetjes HofCAD CSI


    (defun c:exceltest()
    (setvar "CMDECHO" 0)
    (defun dsx-princ(s)
    (if (/= DEBUG nil)
    (princ s))
    )
    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span (strcat "E1:" (chr (+ 64 (length '("A" "B" "C" "D" "E")))) "4")
    range (vlax-get-property xlapp "Range" span)
    )
    (DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
    (DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
    (DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
    (setq span (strcat "A1:" (chr (+ 64 (length '("A")))) "1")
    range (vlax-get-property xlapp "Range" span)
    )
    (setq X_lst '(("1" "2" "3")("4" "5" "6")("7" "8" "9")))
    (setq i 0)
    (repeat  3
    (DSX-Excel-Put-RowList (nth i x_lst) (+ i 1) 1)
    (setq i(1+ i))
    )
    (princ "\n In Excel gelezen:\n")
    (princ (DSX-Excel-GetRangeValues-ByRows 1 1 3 3))
    (setq span (strcat "B5:"
    (chr (+ 64 (length '("A" "B" "C"))))"20" )
    rang1 (vlax-get-property xlapp "Range" span)
    rang1s (vlax-invoke-method rang1 "Select")
    rang1x (vlax-get-property xlapp "Selection")
    rang1f (vlax-get-property rang1x "Font")
    rang1i (vlax-get-property rang1x "Interior")
    rang1a (vlax-get-property rang1x "areas")
    range rang1
    )
    (foreach prop
    (list
    (list "ColorIndex" 35)
    (list "pattern" 18 )
    (list "PatternColor" 255)
    (list "PatternColorIndex" 3)
    )
    (vlax-put-property rang1i (car prop) (cadr prop))
    ) ; foreach
    (setq i 1)
    (repeat 16
    (DSX-Excel-Put-CellColor (+ 4 i) 5 i)
    (setq i (1+ i))
    )
    (setq span (strcat "A23:" (chr (+ 64 (length '("A")))) "23")
    range (vlax-get-property xlapp "Range" span)
    )
    (textscr)
    (DSX-Excel-Put-RowCellsColor 23 1 3 3)
    (DSX-Excel-Put-RowList '("HofCAD" "CSI" "Tilburg") 1 1)
    (setvar "CMDECHO" 1)
    (princ "\n Bovenstaand is in Excel gelezen:\n")
    (princ)
    )
ACADcadabra

WebRacer

bij het onderstaande stopt het programma Hofcad....
zet je animate eens aan...

(DSX-Excel-Get-Cell range startrow startcol)
?

WebRacer

hier klopt iets niet vermoed ik...
die range, dat is waar hij blijft op afknappen, klopt dit wel hofcad?

(DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
(DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
(DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
?

yoin