FastFiber

Projectgegevens van excel naar autocad

Gestart door Reimer, do 23 09 2010, 11:28:49

Vorige topic - Volgende topic

Reimer

Wij hebben een excellijst met onze projectgegevens (projectnummer; naar; opdrachtgever;etc). Daarnaast gebruiken we lisproutines om automatisch dingen in het tekenhoofd in te vullen (datum; naam tekenaar; adresgegevens). Nu vraag ik mij af het erg moeilijk is mbv lisp de gegevens van een bepaald project uit de excellijst te halen aan de hand van het projectnummer.
Ik ben inmiddels een beetje bekend met het wegschrijven van regels naar een *.txt of *.csv bestand met behulp van Lisp. Ik weet alleen nog niet hoe ik het uitlezen en zoeken moet gaan regelen.
Het is mij bekend dat bovenstaande waarschijnlijk makkelijker gaat met VBA, maar hier wil ik nu nog niet aan beginnen.
Wie kan mij helpen met een opzet voor bovenstaande koppeling? Ik heb al veel gelezen over de uitwisseling tussen excel en autocad maar kom er zelf nog niet uit.

Reimer

roy_043

#1
Alternatief idee:
Het is ook mogelijk om een csv-bestand te maken van het Excel-bestand en dit m.b.v. een lisp-functie om te zetten in een lijst die op projectnummer te doorzoeken is.
Of moet per se het Excel-bestand worden gebruikt?

Reimer

Bedankt voor je reactie. Dit lijkt me een goed idee om mee te beginnen. Ik ben alleen nog niet zo bekend met het uitlezen van een csv-bestand. En hoe zoek je het beste in een lijst?

Bijvoorbeeld PROJ.csv:

101;Project 1;plaats1
102;Project 2;plaats2
103;Project 3;plaats3

Het doel is nu om bij het gegeven nummer de juiste omschrijving op te vragen.

Reimer

roy_043

De functie kg:CsvFileToList en de bijbehorende hulpfuncties kg:ReadFile en kg:StringSplit:

;;; Voorbeeld: (kg:CsvFileToList "PROJ.csv" ";") => (("101" "Project 1" "plaats1") ("102" "Project 2" "plaats2") ("103" "Project 3" "plaats3"))
(defun kg:CsvFileToList (file delim)
  (mapcar '(lambda (a) (kg:StringSplit delim a)) (kg:ReadFile file))
)

;;; Voorbeeld: (kg:ReadFile "PROJ.csv") => ("101;Project 1;plaats1" "102;Project 2;plaats2" "103;Project 3;plaats3")
(defun kg:ReadFile (file / fileDescr line lst)
  (if (setq fileDescr (open file "r"))
    (progn
      (while (setq line (read-line fileDescr))
        (setq lst (cons line lst))
      )
      (close fileDescr)
      (reverse lst)
    )
  )
)

(defun kg:StringSplit (delim str / sub result)
  (setq
    delim (append (vl-string->list delim) (list nil))
    str (vl-string->list str)
  )
  (repeat (+ (length str) 1)
    (if (member (car str) delim)
      (setq
        result (cons (vl-list->string (reverse sub)) result)
        sub nil
      )
      (setq sub (cons (car str) sub))
    )
    (setq str (cdr str))
  )
  (reverse result)
)


Voorbeeld van het gebruik van kg:CsvFileToList:

;;; Voorbeeld: (GetProjectData "102")
(defun GetProjectData (projectNrString / dataLst)
  (setq dataLst (assoc projectNrString (kg:CsvFileToList "PROJ.csv" ";")))
  (princ
    (strcat
      "\nProject omschrijving: " (cadr dataLst)
      "\nProject locatie:      " (caddr dataLst)
    )
  )
  (princ)
)

roy_043

@ Reimer: Heb je iets gehad aan mijn vorige bericht?

Reimer

Leuk dat je het blijft volgen. Ik heb jouw code al wel getest (en het werkt uiteraard). Ik heb nog geen tijd gevonden om er mee verder te gaan maar heb dit nog wel in de planning.
Nu we het er toch over hebben; waarvoor staat kg:? Ik ken wel de term (defun c:NAAM ()).

Reimer

roy_043

Kort antwoord:
kg: is niets meer dan een prefix (voorvoegsel). Het zijn de beginletters van mijn achternaam.

Lang antwoord:
Waarom een prefix gebruiken?
In mijn geval zijn er twee redenen:
1.
Als ik een variant wil maken voor een bestaande lisp-functie dan kan ik de nieuwe functie door het gebruik van dit prefix onderscheiden van de bestaande functie. Bijv. kg:Polar i.p.v. polar.
2.
Omdat al mijn lib-functies met "kg:" beginnen kan ik m.b.v. dit prefix gemakkelijk analyseren welk lib-functies in een lisp-programma worden gebruikt. En deze bijvoorbeeld toevoegen aan het programma-bestand als ik een "stand-alone" versie van het programma zou willen publiceren. Dit is overigens voor een groot deel nog toekomstmuziek.

Achtergrond 1:
Naast functie-namen die beginnen met "c:" bestaat er ook nog de functie "s::startup"

Achtergrond 2:
Er bestaat ook nog zoiets als "registered prefix by Autodesk". Autodesk kent aan geregistreerde ontwikkelaars (?) een lisp-prefix toe om naamconflicten tussen lisp-applicaties te voorkomen. Dit is voor mij, als gebruiker van Bricscad, natuurlijk niet van toepassing.

Reimer

Door de code nog eens rustig te bekijken was ik al tot de conclusie gekomen dat kg: gewoon een onderdeel van de naamgeving was. Bedankt voor de toelichting en vooral de achtergrond. Zo leert een mens nog eens wat.

Reimer

FastFiber