Author Topic: Proxy & AEC Clean/Remove  (Read 20830 times)

0 Members and 1 Guest are viewing this topic.

CADDOG

  • Newt
  • Posts: 82
  • wishbonesr
Re: Proxy & AEC Clean/Remove
« Reply #15 on: July 08, 2013, 10:48:09 PM »
Repackaged gile's iterative method, which is nifty without having to expose acdbHandEnt  :kewl:, into a transaction, but that's the only major difference.  I say this pre-emptively because the screen shot will give the impression the error shown is because of the differences.  I used gile's version in it's form, which worked awwweeeesome, until a random drawing was hit (using dbx and lisp), which was just as random as the screen shot version.

Code: [Select]
Autodesk.AutoCAD.Runtime.Exception was unhandled by user code
  Message=eInvalidOpenState
  Source=Acdbmgd
  StackTrace:
       at Autodesk.AutoCAD.DatabaseServices.OpenCloseTransaction.GetObject(ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
       at Autodesk.AutoCAD.DatabaseServices.OpenCloseTransaction.GetObject(ObjectId id, OpenMode mode)
       at CADDOG_LispExpansionPack1.LispFunctions.CleanProxies(Database db, Transaction tr) in C:\Users\medleyr\Documents\Visual Studio 2010\Projects\CADDOG_LispExpansionPack1\CADDOG_LispExpansionPack1\CADDOG_LispExpansionPack1.cs:line 374
       at CADDOG_LispExpansionPack1.LispFunctions.ProxyClean(ResultBuffer rb) in C:\Users\medleyr\Documents\Visual Studio 2010\Projects\CADDOG_LispExpansionPack1\CADDOG_LispExpansionPack1\CADDOG_LispExpansionPack1.cs:line 357
       at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.InvokeLisp()
  InnerException:


So I figured workingdatabase could be an issue, as it was in the past, but that proved a dead-end.

If I open the file into the editor, the function would run and effectively clean the drawing of proxies.  But when in batch, random drawings would give a fatal error.  Handling the error is not a solution, as that would leave a proxy behind.

Any ideas?

Code - C#: [Select]
  1.         [LispFunction("cd:ProxyClean")]
  2.         public Boolean ProxyClean(ResultBuffer rb)
  3.         {
  4.             if (rb == null)
  5.             { return false; }
  6.             TypedValue[] args = rb.AsArray();
  7.             if (args.Length != 1 || (LispDataType)args[0].TypeCode != LispDataType.ObjectId)
  8.             { return false; }
  9.             //we accept any object from the drawing that is to be processed.  I trend in sending modelspace, but it doesn't matter
  10.             //just need an object so the owning database can be retrieved
  11.             ObjectId objId = (ObjectId)args[0].Value;
  12.             Database db = objId.Database;
  13.             using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
  14.             {
  15.                 CleanProxies(db, tr);
  16.                 tr.Commit();
  17.                 return true;
  18.             }
  19.         }
  20.  
  21.         //Alexander's algorithm ??
  22.         //gile - http://www.theswamp.org/index.php?topic=44880.msg501032#msg501032
  23.         private void CleanProxies(Database db, Transaction tr)
  24.         {
  25.             RXClass zombieEntity = RXClass.GetClass(typeof(ProxyEntity));
  26.             RXClass zombieObject = RXClass.GetClass(typeof(ProxyObject));
  27.             ObjectId id;
  28.             for (long l = db.BlockTableId.Handle.Value; l < db.Handseed.Value; l++)
  29.             {
  30.                 if (!db.TryGetObjectId(new Handle(l), out id))
  31.                     continue;
  32.                 if ((id.ObjectClass.IsDerivedFrom(zombieObject) || id.ObjectClass.IsDerivedFrom(zombieEntity))
  33.                     && !id.IsErased)
  34.                 {
  35.                     DBObject proxy = tr.GetObject(id, OpenMode.ForWrite) as DBObject;
  36.                     using (DBObject newObj = new Xrecord())
  37.                     {
  38.                         //try
  39.                         //{
  40.                             proxy.HandOverTo(newObj, false, false);
  41.                             newObj.Erase();
  42.                         //}
  43.                         //catch
  44.                         //{
  45.  
  46.                         //}
  47.  
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.  

Current lisp calls for cd:setworkingdatabase

Code - C#: [Select]
  1.         [LispFunction("cd:SetWorkingDatabase")]
  2.         public object SetWorkingDatabase(ResultBuffer rb)
  3.         {
  4.             if (rb == null)
  5.             {return false;}
  6.             TypedValue[] args = rb.AsArray();
  7.             if (args.Length != 1)
  8.             {return false; }
  9.             try
  10.                 {              
  11.                 Database db = ((ObjectId)args[0].Value).Database;
  12.                 HostApplicationServices.WorkingDatabase = db;
  13.                 return true;
  14.                 }
  15.                 catch (System.Exception)
  16.                 {
  17.                 return false;
  18.                 }
  19.         }
  20.  

And the lisp that uses it.

Code: [Select]
;;ProxyClean v0.1
;;
;;by Ricky Medley - CADDOG Computing
;;ricky.medley@caddog.net
;;Additional Credit: LeeMac LM:GetFiles LM:ODBX Wrapper LM:GetFilesAll LM:BrowseForFolder
;; Thank you Lee for making my life easier
;;
;;GNU GPLv3 licensed
;;http://www.gnu.org/licenses/gpl.html for preamble
;;This means you can modify, and distribute as long as the source code or any derivitive of this
;;code is provided and distributed as well.  You can even compile and sell, but you must provide
;;this source code in the package, and notify the recipient of the license as well.  Porting to
;;other languages as far as form and structure are also applicable to this license.
;;Modification to any code must be submitted back to ricky.medley@caddog.net for as long as the
;;address is valid.
;;The idea is not copyrighted.
;;Feel free to change the name of the command
;;
;;Program Description: Cleans all proxy objects from drawing or batch of drawings.
;; The command used, cd:ProxyClean, is indescriminate, and will
;; clean proxy objects from their proxy data regardless if object
;; enablers are installed.  Please use with caution.
;;
;;Dependencies:
;;;LM:GETFILES - http://www.lee-mac.com/getfilesdialog.html
;;;LM:ODBX - http://www.lee-mac.com/odbxbase.html
;;;LM:GETALLFILES
;;;LM:BROWSEFORFOLDER
;;
;;Future: cd:proxyclean to report back the name/description of the application of the proxy that
;; was cleaned.  This data will need to be handled and will be in a list format.
;;
;;History:
;;6/26/2013 v0.1 - Initial Build v0.1:
;; -
;;

(defun c:ProxyClean (/
      *Error*
      releaseobj
      get-time
      get-utime
      _getsavefile
      process
      cd:dependency
      cd:Get-WebUtils
      vl:list->string

      doc
      process
      opt
      )
  (vl-load-com)

    (defun *error* (msg)
      (cd:setworkingdatabase (vlax-vla-object->ename (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
      (releaseobj doc)
    (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
      (progn
(princ (strcat "\nXref Clean Error: " msg))
(vl-bt)
)
      (princ)
      );if
    );defun *Error*
 
  ;from LeeMac
  (defun releaseobj (obj)
    (if
      (and
(eq 'VLA-OBJECT (type obj))
(not (vlax-object-released-p obj))
)
      (vl-catch-all-apply 'vlax-release-object (list obj))
      )
    );defun releaesobj

  (defun Get-Time (format rev ;return time in two string parts ("5-2-2011";format derives 12 or 24 (feed integer) - default is 24
   ;rev refers to reversing the order from american(relevance order) to logical(numberical order)
   ;rev is t or nil
   /
   ctime cy cm cd ch cm cs suf
   )
    (setq ctime (rtos (getvar "CDATE") 2 6)
  cy (substr ctime 1 4)
  cm (substr ctime 5 2)
  cd (substr ctime 7 2)
  ch  (atoi (substr ctime 10 2))
  cmn  (substr ctime 12 2)
  cs  (substr ctime 14 2)
  suf "")
    (if (= format 12)
      (progn
(if (> ch 12)
  (setq ch (- ch 12)
suf " PM")
  (setq suf " AM")
  );if
);progn
      );if
    (if (= rev t)
      (list (strcat cm "-" cd "-" cy) (strcat (itoa ch) ":" cmn ":" cs suf))
      (list (strcat cy "-" cm "-" cd) (strcat (itoa ch) ":" cmn ":" cs suf))
      );if
    );defun
 
  (defun get-utime ()
    (* 86400 (getvar "tdusrtimer"))
    )


  (defun vl:list->string (delim ls / out)
    (setq out "")
    (mapcar (function (lambda (x)
(setq out (strcat out x delim))))
    ls)
    (if out (vl-string-right-trim delim out))
    );defun list->string

  (defun _getsavefile (prmpt dfltFile fileExt / saveFileName)
    (if (not prmpt) (setq prmpt "Choose Save File"))
    (if (not dfltFile) (setq dfltFile "Output"))
    (if (not fileExt) (setq fileExt "txt"))
    (setq saveFileName (getfiled prmpt dfltFile fileExt 129))
    );defun _getsavefile

   ;need to optimize to accept a list of dependencies
  (defun cd:dependency (/
LM:GetFiles_url
LM:ODBX_url
opt
resource_directory
)
    ;;lee-macs site is not responding... for the past month or so.
    (setq LM:GetFiles_url "http://www.caddog.net/opensource/lisp/lee-mac/GetFilesV1-1.lsp")
    (setq LM:ODBX_url "http://www.caddog.net/opensource/lisp/lee-mac/ObjectDBXWrapperV1-1.lsp")
    (setq resource_directory (strcat (getenv "appdata") "\\Autodesk\\ApplicationPlugins\\Lee-Mac-Utils"))
   
    ;check for required functions
    (if (or (not LM:ODBX)(not LM:GetFiles)(not LM:GetAllFiles)(not LM:BrowseForFolder))
      ;check for variations of the lisp files that might contain the functions
      (if (or (and (setq LM:GetFiles (findfile "GetFiles.lsp"))
   (or (setq LM:ODBX (findfile "ObjectDBXWrapper.lsp"))
       (setq LM:ODBX (findfile "ODBX.lsp"))))
      (and (setq LM:GetFiles (findfile (strcat resource_directory "\\" (vl-filename-base LM:GetFiles_url) (vl-filename-extension LM:GetFiles_url))))
   (setq LM:ODBX (findfile (strcat resource_directory "\\" (vl-filename-base LM:ODBX_url) (vl-filename-extension LM:ODBX_url)))))
      );or
;found them, so load them
(progn
  (load LM:GetFiles)
  (load LM:ODBX)
  );
;else, let's ask to download them.
(progn
  (princ "\nIn order to proceed, Lee-Mac lisp functions must be downloaded:")
  (princ (strcat "\n\t" LM:GetFiles_url))
  (princ (strcat "\n\t" LM:ODBX_url))
  (initget "Yes No")
  (setq opt (getkword "\nAllow connection to CADDOG.net [Yes/No] <Yes>: "))
  (cond ((= opt "No")
;(vl-exit-with-error "Cannot Continue") ;this exit method may not be right
;(princ "Cannot Continue")
;(exit)
)
;(cd:Get-LeeMacUtils DownloadDestination
(t
(if (setq return (cd:Get-WebUtils resource_directory (list LM:GetFiles_url LM:ODBX_url)))
   (mapcar 'load return))
)
);cond
  );progn
);if LM files exists
      );if LM functions defined
    (if (and LM:ODBX LM:GetFiles)
      t
      nil)
    );defun cd:dependency
 
  (defun cd:Get-WebUtils (dest url_list
  /
  *error*
  dest
  url
  msxml
  ADOstream
  return
  )
    (defun *error* (msg /)
      (if msxml (vlax-release-object msxml))
      (if ADOstream (vlax-release-object ADOstream))
      (setq msxml nil
    ADOstream nil)
      (vl-exit-with-error "Get-WebUtils Failed")
      )
   
    (if (setq msxml (vlax-create-object "MSXML2.XMLHTTP"))
      (progn
(vl-mkdir dest)
(foreach url url_list
  ;test if web location exists
  (vlax-invoke-method msxml 'Open "GET" url :vlax-false)
  (vlax-invoke-method msxml 'Send)
  (princ (strcat "\nInquiring: " url))
  (setq status (vlax-get-property msxml "status"))
  (if (= 200 status)
    (progn
      ;start a stream to download
      (setq ADOstream (vlax-create-object "ADODB.Stream"))
      (vlax-invoke-method ADOstream 'Open nil nil nil nil nil)
      (vlax-put-property ADOstream "Type" 1)
      (vlax-invoke-method ADOstream 'Write (vlax-get-property msxml "responseBody"))
      (vlax-put-property ADOstream "Position" 0)
      (setq return (append (list (strcat dest "\\" (vl-filename-base url) (vl-filename-extension url))) return))
      (vlax-invoke-method ADOstream 'SaveToFile (car return) 2)
      (vlax-invoke-method ADOstream 'Close)
      (vlax-release-object ADOstream)
      (princ (strcat "\nSaving To: " (car return)))
      );progn status = 200
    ;else, tell user
    (princ (strcat "\nFileGet Error: " (vlax-get-property msxml "statusText")
   "\n\t" url))
    );if status = 200
  );for each url url_list
(vlax-release-object msxml)
);progn
      (princ "Connection could not be established.")
      );if createobject
    return
    );defun cd:Get-WebUtils
 
 
  (defun _write_data (data filename
      /
      file
      dwg
      xref
      )
    (if (and data filename
     (setq file (open filename "w"))
     );and
      (progn
(write-line (vl:list->string "\t" '("dwg" "proxy_clean_status")) file)
(foreach dwg data
  (foreach xref (cdr dwg)
    (setq clean (mapcar (function (lambda (x) (if x x ""))) xref))
    (write-line (vl:list->string "\t" (append (list (car dwg)) clean)) file)
    );foreach xref
  );foreach dwg
(close file)
);progn
      );if data and filename
    );defun _write_data


  (defun cd:proxy_clean (doc
/
docpath
outdata
logdata
clean-status
)
    ;this test is the difference between dbx and current file
    (if (vlax-property-available-p doc 'FullName) ;only available in UI drawings
      (setq docpath (vl-filename-directory (vla-get-fullname doc)))
      ;else we are in DBX, and need to get a different property and load xrefs
      ;and try set dbx doc as working database
      (progn
(setq docpath (vl-filename-directory (vla-get-name doc)))
(cd:setworkingdatabase (vlax-vla-object->ename (vla-get-modelspace doc)))
);progn
      );if current dwg
    (if (cd:proxyclean (vlax-vla-object->ename (vla-get-modelspace doc)))
      (setq clean-status "clean-ran")
      (setq clean-status "clean-failed")
      );if cd:proxyclean
    (cd:setworkingdatabase (vlax-vla-object->ename (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
    (list (list clean-status))
    );defun cd:proxy_clean

(defun process (runfolder simulate /
  doc
  dwgname
  data
  name
  save
  )
    (setq save (not simulate)) ;usage is opposite on LM:ODBX which is a save or notsave var
    ;so simulate=true is save=false
    (setq doc (vla-get-activedocument (vlax-get-acad-object))
  dwgname (vla-get-fullname doc))
    (cond ((not runfolder)
   (setq data (list (append (list dwgname) (cd:proxy_clean doc))))
   )
  ((and (setq name (strcat (vl-filename-directory dwgname) "\\"))
(setq runfolder (LM:GetFiles "Select Files to Strip Proxy Data" name "dwg"))
(setq name (strcat (vl-filename-directory dwgname) "\\ProxyClean-Log_" (car (get-time 12 nil))))
(setq name (_getsavefile "Choose Log Save File" name "TSV"))
(setq ctime (get-utime))
(setq data (LM:ODBX 'cd:proxy_clean runfolder save))
);and
   )
  );cond
    (cond
      ((and data name)
       (_write_data data name)
       (princ "\nProxyClean Complete")
       (princ (strcat "\nOpening " name))
       (startapp "notepad" name)
       (princ (strcat "\Time: " (rtos (- (get-utime) ctime) 2 2) " seconds"))
       )
      (data
       (princ "\nProxyClean Complete")
       )
      (t (princ "\nProxyClean Failed!!!"))
      );cond
    );defun process

  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq version "v0.1")

  (initget "Select Current")
  (setq opt (getkword "ProxyClean: Process [Select files/Current dwg] <Current dwg>: "))
  (cond
    ((= opt "Select")
     (if (cd:dependency)
       (progn
(initget "Yes No")
(setq opt (getkword "\nSimulated Run? [Yes/No] <No>: "))
(cond
   ((= opt "Yes")
    (process t t))
   (t (process t nil)
    )
   );cond
);t all components in place, can batch
       (princ "Required Items Not Loaded for Batch")
       );if cd:dependency
     )
    ;else
    (t ;t Current drawing only
     (if (cd:dependency)
       (progn
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-endundomark doc)
(vla-startundomark doc)
(process nil nil)
(vla-endundomark doc)
);progn
       );if cd:dependency
     );t Current drawing only
    );cond
  (releaseobj doc)
  (princ)
  );defun c:XrefBindAll

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: Proxy & AEC Clean/Remove
« Reply #16 on: July 09, 2013, 01:23:30 AM »
It might be a situation of the batch-mode falling over its own feet. As it's reading the DB to "open" the DWG, most objects are still locked for reading. Then your function is called and tries to open said object for write - these locks are mutually exclusive, so the open fails.

It might be an idea to give it some time to complete opening and only then run the code. Either some form of Wait in your lisp/script (might need to program such function through DotNet since you can't send commands to DBX), or look for an event about database open completed, or run the lisp through a script, or run the code through the s::startup function ...

Many ways you could try to give the DBX engine time to complete its open. You could even simply add the proxy objects to a queue and start a thread which runs through this queue until it's empty. The try can then simply fail and leave said object on the queue - seeing as it's going to loop and try again later. I'd definitely try to do this through a separate thread though - otherwise acad might feel locked up. You could then have another method checking for the progress of that queue - allowing something like a progress bar for user fed-back.
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

CADDOG

  • Newt
  • Posts: 82
  • wishbonesr
Re: Proxy & AEC Clean/Remove
« Reply #17 on: July 09, 2013, 09:56:06 PM »
You could even simply add the proxy objects to a queue and start a thread which runs through this queue until it's empty. The try can then simply fail and leave said object on the queue -

Good call.  Solved that problem.  Now another one has reared it's ugly head.  In dbx, all objects are of type AcRxObject.   :ugly:   I'm sorry... I just can't stop giggling in total frustration.

Gonna go back to casting to see if that can trap it in either a proxyentity or proxyobject.

CADDOG

  • Newt
  • Posts: 82
  • wishbonesr
Re: Proxy & AEC Clean/Remove
« Reply #18 on: July 09, 2013, 11:29:05 PM »
Casting works in both dbx db's and mdiactivedocument db's.  See last function GetDBProxyCol.

This implementation implements irneb's suggestion of finding, collecting, then cleaning in a while loop.  Worked like a charm.

Also of relevance: I removed the call to lispfunction to change working databaes.  I didn't think I needed it, and was only a test.  The only time I've needed to set working database was when working on attributes.

Code - C#: [Select]
  1.         [LispFunction("cd:ProxyClean")]
  2.         public Boolean ProxyClean(ResultBuffer rb)
  3.         {
  4.            
  5.             if (rb == null)
  6.             { return false; }
  7.             TypedValue[] args = rb.AsArray();
  8.             if (args.Length != 1 || (LispDataType)args[0].TypeCode != LispDataType.ObjectId)
  9.             { return false; }
  10.             //we accept any object from the drawing that is to be processed.  I trend in sending modelspace, but it doesn't matter
  11.             //just need an object so the owning database can be retrieved
  12.             ObjectId objId = (ObjectId)args[0].Value;
  13.             Database db = objId.Database;
  14.             using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
  15.             {
  16.                 CleanProxies(GetDBProxyCol(db, tr), db, tr);
  17.                 tr.Commit();
  18.                 return true;
  19.             }
  20.         }
  21.  
  22.         //recieves a collection of proxy ONLY objectids.  No checking to see if that's true
  23.         //will loop until all proxies are successfully stripped (opened for write)
  24.         private void CleanProxies(ObjectIdCollection proxyCol, Database db, Transaction tr)
  25.         {
  26.             while (proxyCol.Count > 0)
  27.             {
  28.                 try
  29.                 {
  30.                     DBObject proxy = tr.GetObject(proxyCol[0], OpenMode.ForWrite) as DBObject;
  31.                     using (DBObject newObj = new Xrecord())
  32.                     {
  33.                         proxy.HandOverTo(newObj, false, false);
  34.                         proxyCol.RemoveAt(0);
  35.                     }
  36.                 }
  37.                 catch
  38.                 { } //catch to try try again
  39.             }
  40.         }
  41.  
  42.         //Alexander's algorithm ??
  43.         //gile - http://www.theswamp.org/index.php?topic=44880.msg501032#msg501032
  44.         //managed transaction base to retrieve all proxy objects in drawing by cycling through every object id db
  45.         private ObjectIdCollection GetDBProxyCol(Database db, Transaction tr)
  46.         {
  47.             ObjectIdCollection proxyCol = new ObjectIdCollection();
  48.             ObjectId id;
  49.             for (long l = db.BlockTableId.Handle.Value; l < db.Handseed.Value; l++)
  50.             {
  51.                 if (!db.TryGetObjectId(new Handle(l), out id))
  52.                     continue;
  53.                 if (!id.IsErased)
  54.                 {
  55.                     DBObject dbObj = tr.GetObject(id, OpenMode.ForRead) as DBObject;
  56.                     ProxyObject proxyObj = dbObj as ProxyObject;
  57.                     ProxyEntity proxyEnt = dbObj as ProxyEntity;
  58.                     if (proxyObj != null || proxyEnt != null)
  59.                         proxyCol.Add(id);
  60.                 }
  61.             }
  62.             return proxyCol;
  63.         }
  64.  

I can finally rest.  Thanks to everyone who's input made this happen.
Gile for the primary source
Irneb for the directional guidance.
Jeff H for the base understanding.
And Alexander Rivilis for the suggestion of db iteration so that nothing is missed

I can't thank you guys enough, as I've been struggling through this one for three weeks (almost full time), and I was worried that I could have cycled the drawing manually by now.

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: Proxy & AEC Clean/Remove
« Reply #19 on: July 10, 2013, 02:57:23 AM »
This implementation implements irneb's suggestion of finding, collecting, then cleaning in a while loop.  Worked like a charm.
Glad it worked for you.

Edit: Though I'd definitely try to change that loop into a thread instead. I know it's a lot more complex, but you'll find that you can do a lot more very easily. E.g. what if there's some error outside your control (say ACad trying to open a corrupt DWG)? That loop will just continue indefinitely. With a thread you can always abort after a specified maximum time so that the rest of your code can continue.

You could probably also write something like that into your while loop. Say set a start-time variable from DateTime.Now(), then have your loop check the ellapsed time as a second exit option.
Code - C#: [Select]
  1. private void CleanProxies(ObjectIdCollection proxyCol, Database db, Transaction tr) {
  2.     DateTime stop_at  = DateTime.Now().AddMilliseconds(60000); // Set maximum stop time 1 minute after starting
  3.     while ((proxyCol.Count > 0) && (stop_at > DateTime.Now())) {
  4.         try {
  5.             DBObject proxy = tr.GetObject(proxyCol[0], OpenMode.ForWrite) as DBObject;
  6.             using (DBObject newObj = new Xrecord()) {
  7.                 proxy.HandOverTo(newObj, false, false);
  8.                 proxyCol.RemoveAt(0);
  9.             }
  10.         }
  11.         catch { } //catch to try try again
  12.     }
  13. }
« Last Edit: July 10, 2013, 03:12:04 AM by irneb »
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

CADDOG

  • Newt
  • Posts: 82
  • wishbonesr
Re: Proxy & AEC Clean/Remove
« Reply #20 on: July 15, 2013, 10:54:25 AM »
Inerb, Ok.  Will do.  Thanks for the example.

Everything has run and completed, and files are on their way to client (clean as a whistle).  Thanks to everybody again.