Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour « challenge » dans sujets.

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Fonctionnement de ce site
    • Nouvelle règle pour les invités : plus d'écriture possible sans inscription
    • CADxp, comment ça marche?
    • CADxp, vos souhaits
    • Forum test
  • Emploi
    • Emploi, monde du travail
  • AutoCAD
    • AutoCAD 3D
    • AutoCAD 2020-2024
    • AutoCAD LT 2024
    • AutoCAD LT 2020-2023
    • AutoCAD 2019
    • AutoCAD LT 2019
    • AutoCAD 2018
    • AutoCAD LT 2018
    • AutoCAD 2017
    • AutoCAD LT 2017
    • AutoCAD avant 2017
    • AutoCAD LT avant 2017
    • Tutoriaux AutoCAD
    • AutoCAD, liste de souhaits
  • Autres logiciels de CAO
    • Microstation
    • IntelliPlus, IntelliCAD, CadIdesk
    • ZWCAD
  • Architecture, Bâtiment
    • Revit
    • AutoCAD Architecture
    • AutoCAD MEP
    • BIM
  • Mécanique
    • Inventor
    • SolidWorks
    • Creo (ex. Pro/Engineer)
    • Catia
  • SIG, Génie civil, Cartographie, VRD
    • Autodesk Map
    • VRD
    • Covadis
    • Infraworks 360
    • Mensura
    • AutoCAD Civil
    • Autopiste
    • SIG internet
  • Imagerie, animation, PAO, modélisation 3D
    • 3DSMAX
    • Création et retouche d'images
    • Sketchup
    • Autres logiciels d'infographie
    • Lumion 3D
  • Programmation
    • LISP et Visual LISP
    • VBA et VB
    • Personnalisation, macros, DIESEL
    • ObjectARX/DBX, C++, .NET, RealDWG
    • Programmer en s'amusant
    • Suggestions de développements
  • Trucs et astuces
    • AutoCAD trucs et astuces
    • Windows trucs et astuces
  • Matériel CAO
    • Ordinateurs
    • Périphériques d'entrée
    • Périphériques de sortie, impression
  • Divers
    • CAO, généralités
    • Echanges de fichiers
    • Organisation du travail
    • Visualisateurs, annotation
    • Pause café
    • Bibliothèques de composants
    • Formation
  • Logiciels connexes
    • Devis, métré, estimation, quantitatif
    • Calculs et simulation
  • Forums métier
    • Bâtiment
    • Infrastructures

Calendriers

Il n’y a aucun résultat à afficher.

Blogs

Il n’y a aucun résultat à afficher.


Rechercher les résultats dans…

Rechercher les résultats qui contiennent…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


AIM


MSN


Website URL


ICQ


Yahoo


Jabber


Skype


Location


Interests

  1. Bonsoir Cette fois ci, c'est un challenge je l'ai trouvé sur un autre site, mais je le trouve fort intéressant, instructif et utile Il s'agit d'effacer tous les textes/mtextes vides dans un dessin @+
  2. Bonsoir, encore un challenge d'un niveau intermédiaire. Ceux qui connaissent déjà la réponse seraient gentil d'attendre demain soir pour donner leur réponse afin que les autres puissent chercher un peu Alors pour les autres, n'hésitez pas J'aimerai savoir si dans ma liste de chiffres, je n'ai que des nombres > à 5 et < à 10 '(6 6.5 7 8 8.5 9) --> T '(5 6 6.5 7 8 8.5 9) --> nil '(6 6.5 7 8 8.5 9 10) --> nil @+ ps : Ce n'est pas parce que j'ai lancé le sujet que je suis le seul à apporter aussi les réponses, c'est interactif ;)
  3. Un nouveau challenge, que je dirais niveau intermédiaire, mais je trouve difficile de parler de "niveaux" tant les expériences de chacun sont diverses. Donc, merci à que ceux qui auraient une solution immédiate de laisser un peu chercher les autres ;) Il s'agit de faire une bascule sur un (ou des) code(s) binaire(s) d'une variable système. La réponse pourrait être la forme : (defun bascule (variable drapeau) ...) et fonctionner comme dans les exemples suivant. Exemple 1 : activer/désactiver le mode ortho (getvar "ORTHOMODE") -> 0 (bascule "ORTHOMODE" 1) (getvar "ORTHOMODE") -> 1 (bascule "ORTHOMODE" 1) (getvar "ORTHOMODE") -> 0 ... Exemple 2 : activer/désactiver différents modes d'accochage aux objet (ex : milieu,centre) (getvar "OSMODE") -> 7 (extrémité, milieu, centre) (bascule "OSMODE" 6) (getvar "OSMODE") -> 1 (extrémité) (bascule "OSMODE" 6) (getvar "OSMODE") -> 7 (extrémité, milieu, centre) ... ou (getvar "OSMODE") -> 3 (extrémité, milieu) (bascule "OSMODE" 6) (getvar "OSMODE") -> 5 (extrémité, centre) (bascule "OSMODE" 6) (getvar "OSMODE") -> 3 (extrémité, milieu) ... ou encore activer/désactiver tous les accrochages aux objets...
  4. Bonsoir Encore un challenge mais qui change des listes Il s'agit de convertir un nombre en hexa et inversement ex : (hex 448) -> "1C0" ex : (dec "1C0") -> 448 ps : ne trichez pas en utilisant les fonctions vba ;) @+
  5. Donc, toujours dans la serie. (demain, j'en donne un plus facile pour un niveau intermédiaire) J'ai une chaine de caractère que je souhaite incrémenter de +1 ex : "aaa" --> "aab" ex : "aaz" --> "aba" ex : "aef" --> "aeg" ex : "azz" --> "baa" ex : "zzz" --> "aaaa" Et pour ceux qui y arrivent, il serait interessant de pouvoir aussi incrémenter la chaine de caractère de +3 ou +10 par exemple ps : Merci à BonusCad de ne pas donner la réponse au premier challenge et perso, je n'ai pas reussi le suivant, sauf par une boucle, mais pas top :( @+
  6. Un autre challenge, Inclure une liste dans une autre à une position donnée. Exemple : inclure '("d" "e" "f") dans '("a" "b" "c" "g" "h" "i") entre le"c" et le "g". (inc-lst '("d" "e" "f") '("a" "b" "c" "g" "h" "i") 3) ou (inc-lst '("d" "e" "f") '("a" "b" "c" "g" "h" "i") "c") doit retourner ("a" "b" "c" "d" "e" "f" "g" "h" "i") Désolé, le coup est parti tout seul... [Edité le 17/5/2007 par (gile)]
  7. Voilà, puisque les challenges font progresser tout le monde, en voici un qui me trotte depuis un certain moment: nous avons des faces 3D qui modelisent un terrain (le terrain naturel) un second qui represente un modelage ou projet. je voudrais par exemple lorsque je clique a un endroit aléatoire avoir les informations suivantes: le Z du terrain naturel le Z du projet et le delta Z (Z terrain - Z projet). Voila je ne vous demande pas de repondre tout de suite mais donner quelques idées afin que la plupart des personnes qui veulent develloper puissent participer. Disons que la reponse definitive (si il y a) soit donnée dans une semaine. Merci d'avance de votre participation. @plus LB
  8. Salut, Ça faisait longtemps, alors un sujet sur un forum étranger m'a donné une idée. Faire une routine pour remplacer toutes les occurrences d'un élément (atom) dans une liste et dans les sous listes qu'elle peut contenir quelque soit leur niveau d'imbrication. Pour être polyvalente, la routine pourra admettre 3 arguments comme la fonction subst : - le nouvel élément - l'élément à remplacer - la liste Exemple, remplacer tous les 1 par des 2 dans les listes suivantes : (toto 2 1 '((1 4) (1 3) (5 5) (1 1))) --> ((2 4) (2 3) (5 5) (2 2)) (toto 2 1 '(1 (4 (1 (3 1)) 1) 1 2 1)) --> (2 (4 (2 (3 2)) 2) 2 2 2)
  9. Vous voulez quelque chose de prenant ;) Faire l'algorithme d'une recherche dichotomique Par exemple avec cette liste (setq lst '("a" "d" "g" "t" "r")), je recherche la position de "t" dans la liste Cette recherche procède de cette manière Le milieu de la liste est "g" soit (setq mil (fix (/ (length lst) 2))) "t" = "q" non, donc avant ou après "t" < "g" non, donc après "t" > "g" oui --> je prends le milieu de ma liste entre "g" et "r" qui me donne "t" soit (+ mil (fix (/ (- (length lst) mil) 2))) Le but est de faire une recherche rapide et intelligente plutôt que d'utiliser les boucles. Je n'ai pas l'algorithme, mais je pense qu'il va être plaisant à faire @+
  10. Bonsoir, j 'ai voulu faire un autre jeu; à savoir atteindre une cible avec une flèche. Il y a une boite de réglage. ça marche à peu près. Toujours faire la tension de la corde (1) avant de varier l 'angle (2). Justement, j 'aimerais pouvoir tendre ou détendre après avoir changer l 'angle. Si il y a des amateurs.... le code à mettre dans Module1 Public arc As AcadArc Public fleche As AcadLine Public long_fleche As Double Public corde As AcadLWPolyline Public pt0(0 To 2) As Double Public pt1(0 To 2) As Double Public rayon As Double Public angdep As Double Public angdar As Double Public alpha As Double Public lcorde As Double Public ptpoly(0 To 5) As Double Public pttmp As Variant Public ptdepfleche(0 To 2) As Double Public ptdarfleche(0 To 2) As Double Public ptrepos(1) As Double Public pivot(0 To 2) As Double Public ligne_pivot As AcadLine Public cercle As AcadCircle Public ligne As AcadLine Public ptdar_ligne_pivot(0 To 2) As Double Public pos_alea(0 To 2) As Double Public cercle1 As AcadCircle Public Sub talarc() pt0(0) = 0: pt0(1) = 0: pt0(2) = 0 'pt1(0) = 20: pt1(1) = 0: pt1(2) = 0 rayon = 130 angdep = 337 * (3.141589 / 180) 'en radians angdar = 23 * (3.141589 / 180) 'en radians alpha = (2 * 3.141589) - (angdep - angdar) 'angle de l 'arc en radians long_fleche = 100 'trace l 'arc Set arc = ThisDrawing.ModelSpace.AddArc(pt0, rayon, angdep, angdar) 'longueur de la corde lcorde = (2 * rayon) * Sin(alpha / 2) 'trace la corde en LW polyligne pttmp = arc.StartPoint ptpoly(0) = pttmp(0): ptpoly(1) = pttmp(1) ptpoly(2) = pttmp(0): ptpoly(3) = pttmp(1) + lcorde / 2 pttmp = arc.EndPoint ptpoly(4) = pttmp(0): ptpoly(5) = pttmp(1) Set corde = ThisDrawing.ModelSpace.AddLightWeightPolyline(ptpoly) pivot(0) = ptpoly(2) + 10.3347: pivot(1) = ptpoly(3): pivot(2) = 0 'trace fleche 'son point de départ correspondant au sommet 1 de la poyligne corde ptdepfleche(0) = ptpoly(2): ptdepfleche(1) = ptpoly(3): ptdepfleche(2) = 0 'son point final tenant mpte de la longueur ptdarfleche(0) = ptpoly(2) + long_fleche: ptdarfleche(1) = ptpoly(3): ptdarfleche(2) = 0 Set fleche = ThisDrawing.ModelSpace.AddLine(ptdepfleche, ptdarfleche) 'trace ligne de pivot et le cercle qui vont servir à la balistique de la fleche 'Ces 2 éléments sont rendus invisibles ptdar_ligne_pivot(0) = pivot(0): ptdar_ligne_pivot(1) = pivot(1) - 1000: ptdar_ligne_pivot(2) = 0 Set ligne_pivot = ThisDrawing.ModelSpace.AddLine(pivot, ptdar_ligne_pivot) ligne_pivot.Visible = False Set cercle = ThisDrawing.ModelSpace.AddCircle(pivot, fleche.Length) cercle.Visible = False 'appel la création la cible aléatoire cible 'zoom étendu Application.ZoomExtents REGLAGE.Show End Sub Public Sub cible() 'trace cible 'position aléatoire Randomize pos_alea(0) = Int(800 - 500 + 1) * Rnd + 500 pos_alea(1) = 0 pos_alea(2) = 0 Set cercle1 = ThisDrawing.ModelSpace.AddCircle(pos_alea, 20) End Sub le formulaire à télécharger compressé: ici Macro à exécuter : talarc
  11. Allez, il faut bien faire repartir ces challenges... :D Dites moi si c'est trop simple, ou si ça a déjà été tenté ! Personnellement c'est trop dur... on part d'une chaine de caractères avec chiffres et lettres, et la fonction retourne une liste avec chiffres et les lettres séparées... Ex : "qvf12qsdf125 5sf 56dfv2" -> ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2) Ex : "a1b2c3d4e5" -> ("a" 1 "b" 2 "c" 3 "d" 4 "e" 5) Ex : "12.52cm" -> (12.52 "cm") Voilà ! [Edité le 1/10/2007 par Matt666]
  12. Et Bing encore un !! il s'agit de supprimer les points alignés et au milieu de 2 autres dans une liste de points... Ex : (remove-align '((18.0071 2.97385 0.000000) (18.0071 11.0191 0.000000) (21.4685 11.0191 0.000000) (24.8363 11.0191 0.000000) (24.8363 7.93200 0.000000) (24.8363 2.97385 0.000000) (18.0071 2.97385 0.000000))) -> ((18.0071 2.97385 0.000000) (18.0071 11.0191 0.000000) (24.8363 11.0191 0.000000) (24.8363 2.97385 0.000000) (18.0071 2.97385 0.000000)) je sais pas si c'est assez clair... Voilà ! bon courage ! Matt.
  13. Salut, j ai fais une piece "amusante" en tolerie: 4 courbes formant une boucle une surface lissé (lissage frontiere) une tole cree par decalage a partir de la surface et la je suis assez content de moi malheureusement, impossible de la deplier donc pour les cracks, voila le challenge ! bon je peux vivre sans la deplier, c est mon fournisseur qui va s en dermerder mais c est qd meme un truc interessant je pense et j aimerai bien comparer le resultat de la deplié avec certaines données que j ai @ tantot !!
  14. alors sache qu'au pire j'écris le code quand je peux j'avance pas assez vite... mais j'avance petit à petit, j’espère clôturer mon quickhull (au début adapter pour 4 pts mais je vise un peux plus pour le challenge) un extrait pour ta patience ? Je suis en train d'écrire le QuickHull (en fin de code) '''PARTIE FONCTION MATH Function Hypothenuse(DX, DY) Hypothenuse = Sqr(DX * DX + DY * DY) End Function Function PI() PI = 4 * Atn(1) End Function Function MATH_AX_B_2PTS(Pt1, PT2) 'Ax+B Dim c(0 To 1) As Double c(0) = (PT2(1) - Pt1(1)) / (PT2(0) - Pt1(0)) 'A c(1) = PT2(1) - c(0) * PT2(0) 'B MATH_AX_B_2PTS = c End Function Function MATH_DISTANCE_PT_DROITE(a, b, PT) NUMERATEUR = Abs(a * PT(0) - PT(1) + b) DENOM = Sqr((a ^ 2 + 1)) MATH_DISTANCE_PT_DROITE = NUMERATEUR / DENOM End Function Function MATH_AX_B_PERPENDICULAIRE(a, b, PT) Dim c(0 To 1) As Double c(0) = 1 / (-a) c(1) = PT(1) - a * PT(0) MATH_AX_B_PERPENDICULAIRE = c End Function Function MATH_PT_INTERSECTION_2_DROITE(A1, B1, A2, B2) Dim c(0 To 1) As Double X = (B2 - B1) / (A1 - A2) Y = A1 * X + B1 c(0) = X c(1) = Y MATH_PT_INTERSECTION_2_DROITE = c End Function Function MATH_ALTI_POINT_TRIANGLE(PA, PB, PC, Pm) Vab = VECTEUR(PA, PB) Vac = VECTEUR(PA, PC) VN = PROD_VECTEUR(Vab, Vac) MATH_ALTI_POINT_TRIANGLE = Z_VECTEUR_NORMAL_Pa(PA, Pm, VN) End Function Function VECTEUR(PA, PB) Dim V(0 To 2) As Double For i = 0 To 2 V(i) = PB(i) - PA(i) 'Vecteur ab Next i VECTEUR = V End Function Function PROD_VECTEUR(Vab, Vac) Dim V(0 To 2) As Double V(0) = Vab(1) * Vac(2) - Vab(2) * Vac(1) V(1) = Vab(2) * Vac(0) - Vab(0) * Vac(2) V(2) = Vab(0) * Vac(1) - Vab(1) * Vac(0) PROD_VECTEUR = V End Function Function Z_VECTEUR_NORMAL_Pa(PA, Pm, VN) T1 = PA(0) * VN(0) + PA(1) * VN(1) T2 = PA(2) * VN(2) T3 = Pm(0) * VN(0) T4 = Pm(1) * VN(1) Z_VECTEUR_NORMAL_Pa = (T1 + T2 - T3 - T4) / VN(2) 'z4 = (x1*xn + y1*yn + z1*zn – x4*xn – y4*yn) / zn End Function Function DotProduct(v1 As Variant, v2 As Variant) As Double 'Produit scalaire par (gile) DotProduct = v1(0) * v2(0) + v1(1) * v2(1) + v1(2) * v2(2) End Function Function POINT_ON_POLY(PolyLigne, Pt1) Dim NbrePoints As Integer Dim Pt1(0 To 2) As Double Dim PT2(0 To 2) As Double Dim Ray As AcadRay Dim Points As Variant PT2(0) = Pt1(0) + 1 PT2(1) = Pt1(1) PT2(2) = Pt1(2) Set Ray = ThisDrawing.ModelSpace.AddRay(Pt1, PT2) ' Calcul du nombre de points d'intersection Points = PolyLigne.IntersectWith(Ray, acExtendNone) NbrePoints = UBound(Points) / 3 ' Détermination en fonction de la parité If NbrePoints Mod 2 = 0 Then 'MsgBox "Le point n'est pas dans le contour" POINT_ON_POLY = True Else 'MsgBox "Le point est dans le contour" POINT_ON_POLY = True End If Ray.Delete End Function Function PT_AU_DESSUS_DROITE(a, b, PT) Y = PT(0) * a + b If Y >= PT(1) Then PT_AU_DESSUS_DROITE = False Else PT_AU_DESSUS_DROITE = True End If End Function Function AJ_POINT_PO(plineObj, Num_vertex, PT) Dim newVertex(0 To 1) As Double newVertex(0) = PT(0) newVertex(1) = PT(1) plineObj.AddVertex Nun_vertex, newVertex plineObj.Closed = True AJ_POINT_PO = Num_vertex End Function Function POINT_SOMMET_POLY(Poly, PT) Dim PT_PO(0 To 1) As Double POINT_SOMMET_POLY = False d_D = 0.0001 COORD = Poly.Coordinates For j = 0 To UBound(COORD) Step 2 D_X = PT_PO(j) - PT(0) D_Y = PT_PO(j + 1) - PT(1) If FONCT.Hypothenuse(D_X, D_Y) < d_D Then POINT_SOMMET_POLY = True Exit Function Else End If Next j End Function Function POINT_D_MAX(Poly, LIST_POINT, NB_POINT, AX_B_, AU_DESSUS) 'Sous la forme L_POINT(XYZ, X) X nombre de points,XYZ min = 1 D_MAX = 0 For POINT = 0 To NB_POINT P_T(0) = LIST_POINT(0, POINT) P_T(1) = LIST_POINT(1, POINT) If POINT_SOMMET_POLY(Poly, P_T) = False Then If AU_DESSUS = PT_AU_DESSUS_DROITE(AX_B_(0), AX_B_(1), P_T) Then If D = "" Then D_MAX = FONCT.MATH_DISTANCE_PT_DROITE(AX_B_(0), AX_B_(1), P_T) D = FONCT.MATH_DISTANCE_PT_DROITE(AX_B_(0), AX_B_(1), P_T) POINT_D_MAX = P_T(0) & ";" & P_T(1) Else D = FONCT.MATH_DISTANCE_PT_DROITE(AX_B_(0), AX_B_(1), P_T) If D > D_MAX Then POINT_D_MAX = P_T(0) & ";" & P_T(1) Else End If End If Else End If Else End If Next POINT End Function Function RECH_DES_4_POINTS_LES_PLUS_PROCHES(Pp1, NOM_BLOC) Dim TABL(4, 3) As Variant Dim temp As Long Dim blockRefObj As AcadBlockReference X = 0 Y = 1 Z = 2 D = 3 temp = -1 For ent = 0 To ThisDrawing.ModelSpace.Count - 1 Set entity = ThisDrawing.ModelSpace.Item(ent) If entity.ObjectName = "AcDbBlockReference" Then Set blockRefObj = entity If blockRefObj.EffectiveName = NOM_BLOC Then '"PTTOPO" 'DIST = FONCT.Hypothenuse(blockRefObj.InsertionPoint(X) - Pp1(X), blockRefObj.InsertionPoint(Y) - Pp1(Y)) D_X = blockRefObj.InsertionPoint(X) - Pp1(X) D_Y = blockRefObj.InsertionPoint(Y) - Pp1(Y) DIST = FONCT.Hypothenuse(blockRefObj.InsertionPoint(X) - Pp1(X), blockRefObj.InsertionPoint(Y) - Pp1(Y)) temp = temp + 1 If temp <= 4 Then Else temp = 4 End If For i = X To Z TABL(temp, i) = blockRefObj.InsertionPoint(i) Next i TABL(temp, D) = DIST Call Tri_2D(TABL, 0, temp, 3) Else End If Else End If Next ent RECH_DES_4_POINTS_LES_PLUS_PROCHES = TABL End Function Function CALCUL_Z_DANS_TRIANGLE_Z(Pa2D, Pb2D, Pc2D) Pa2D(2) = 0 Pb2D(2) = 0 Pc2D(2) = 0 Vab = FONCT.VECTEUR(Pa2D, Pb2D) Vac = FONCT.VECTEUR(Pa2D, Pc2D) Vam = FONCT.VECTEUR(Pa2D, M) Vba_ = FONCT.VECTEUR(Pb2D, Pa2D) Vbc = FONCT.VECTEUR(Pb2D, Pc2D) Vbm = FONCT.VECTEUR(Pb2D, M) Vca = FONCT.VECTEUR(Pc2D, Pa2D) Vcm = FONCT.VECTEUR(Pc2D, M) PV1_1 = FONCT.PROD_VECTEUR(Vab, Vam) PV1_2 = FONCT.PROD_VECTEUR(Vam, Vac) PV2_1 = FONCT.PROD_VECTEUR(Vba_, Vbm) PV2_2 = FONCT.PROD_VECTEUR(Vbm, Vbc) PV3_1 = FONCT.PROD_VECTEUR(Vca, Vcm) PV3_2 = FONCT.PROD_VECTEUR(Vcm, Vcm) PROD_SCAL_1 = FONCT.DotProduct(PV1_1, PV1_2) PROD_SCAL_2 = FONCT.DotProduct(PV2_1, PV2_2) PROD_SCAL_3 = FONCT.DotProduct(PV3_1, PV3_2) If PROD_SCAL_1 >= 0 And PROD_SCAL_2 >= 0 And PROD_SCAL_2 >= 0 Then Z = FONCT.MATH_ALTI_POINT_TRIANGLE(Pt1, PT2, pt3, P) pr(0) = P(0) pr(1) = P(1) pr(2) = Z Else End If End Function '''''''''''''''''''''''''''''''' ''''TRI A BULLE PAS DE MOI !!!! '''''''''''''''''''''''''''''''''' Public Sub Tri_2D(ByRef Tableau As Variant, _ mini As Long, _ Maxi As Long, _ Optional Colonne As Long = 0) Dim i As Long, j As Long, Pivot As Variant, TableauTemp As Variant, ColTemp As Long On Error Resume Next i = mini: j = Maxi Pivot = Tableau((mini + Maxi) \ 2, Colonne) While i <= j While Tableau(i, Colonne) < Pivot And i < Maxi: i = i + 1: Wend While Pivot < Tableau(j, Colonne) And j > mini: j = j - 1: Wend If i <= j Then ReDim TableauTemp(LBound(Tableau, 2) To UBound(Tableau, 2)) For ColTemp = LBound(Tableau, 2) To UBound(Tableau, 2) TableauTemp(ColTemp) = Tableau(i, ColTemp) Tableau(i, ColTemp) = Tableau(j, ColTemp) Tableau(j, ColTemp) = TableauTemp(ColTemp) Next ColTemp Erase TableauTemp i = i + 1: j = j - 1 End If Wend If (mini < j) Then Call Tri_2D(Tableau, mini, j, Colonne) If (i < Maxi) Then Call Tri_2D(Tableau, i, Maxi, Colonne) End Sub '''''''''''''CODE EN COURS d'ECRITURE !!!!!! Function QUICKHULL(L_POINT, NB_POINT) 'Sous la forme L_POOINT(XYZ, X) X nombre de points,XYZ min = 1 L_bound = 0 U_BOUND = NB_POINT 'Recherche des points extremes gauche et point droit Dim AX_B() Dim PT_GAUCHE(0 To 1) As Double Dim PT_DROIT(0 To 1) As Double Dim POLYPOINT(0 To 3) As Double For i = L_bound To U_BOUND If i = 0 Then PT_GAUCHE(0) = L_POINT(0, i) PT_GAUCHE(1) = L_POINT(1, i) PT_DROIT(0) = L_POINT(0, i) PT_DROIT(1) = L_POINT(1, i) Else If L_POINT(0, i) < PT_GAUCHE(0) Then PT_GAUCHE(0) = L_POINT(0, i) PT_GAUCHE(1) = L_POINT(1, i) Else End If If L_POINT(0, i) > PT_DROIT(0) Then PT_DROIT(0) = L_POINT(0, i) PT_DROIT(1) = L_POINT(1, i) Else End If End If Next i POLYPOINT(0) = PT_DROIT(0) POLYPOINT(1) = PT_DROIT(1) POLYPOINT(2) = PT_GAUCHE(0) POLYPOINT(3) = PT_GAUCHE(1) Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(POLYPOINT) AX_B_0 = FONCT.MATH_AX_B_2PTS(PT_GAUCHE, PT_DROIT) ReDim Preserve AX_B(0) AX_B(0) = AX_B_0 Dim PT_TEMP(0 To 2) 'Point au dessus PT_DESSUS = True dr = 0 For i = L_bound To U_BOUND PT_TEMP(0) = L_POINT(0, i) PT_TEMP(1) = L_POINT(1, i) If POINT_SOMMET_POLY(plineObj, PT_TEMP) = False Then D = FONCT.MATH_DISTANCE_PT_DROITE(AX_B(dr)(0), AX_B(dr)(1), PT_TEMP) If PT_AU_DESSUS_DROITE(AX_B(0), AX_B(1), PT_TEMP) = PT_DESSUS Then Nb_vertex = AJ_POINT_PO(plineObj, 1, PT_TEMP) + 1 Else End If Else End If Next i End Function Merci de ne pas porter de jugement !!!! C'est V0.0 XD donc même pas fini XD Je vais ajouter un point a ma polyligne ensuite vérifier les points encore au dessus des 2 segments créés ! D'ailleurs peut etre gérer par rapport a la polyligne plutot qu'aux points d'ailleurs.... bon ben je vais modifier ça XD
  15. Celui là, c'est pour les champions et le résultat pourra être placé dans les routines LISP il s'agit de modéliser un terrain à partir de points topographiques XYZ un des algorythmes utilisables est l'algorythme de Delaunay expliqué brièvement sur l'image ci dessous http://xs215.xs.to/xs215/07221/Image5.jpg petit truc pour aider au début : le premier triangle peut être aisément remplacé par un rectangle qui englobe l'ensemble des point et qu'on partage immédiatement en 2 triangles selon une diagonale. Petit (gros) bonus pour les acharnés : c'est plus beau de gérer les triangles en mémoire dans une liste et de ne tracer l'ensemble des 3Dfaces qu'à la fin... ci dessous une liste de points 3D (261.341 151.864 118.208) (261.341 231.435 109.913) (261.341 209.625 108.910) (261.341 187.688 111.296) (261.341 165.778 113.907) (261.341 143.880 116.624) (244.612 132.933 108.374) (243.423 154.766 106.772) (241.139 176.734 106.750) (238.306 198.775 107.633) (235.467 220.854 109.054) (233.168 242.068 117.193) (231.955 262.027 127.368) (217.871 252.288 122.565) (220.615 231.858 112.188) (209.367 221.134 107.400) (214.361 198.875 104.777) (219.337 176.621 102.725) (223.547 154.569 101.787) (216.735 132.933 103.892) (234.937 143.767 103.828) (203.039 154.269 104.912) (207.431 132.933 106.385) (197.267 176.411 103.857) (205.387 187.703 103.276) (187.490 210.195 103.050) (193.993 232.177 108.430) (189.535 252.556 117.659) (202.315 262.170 126.142) (173.809 262.194 117.792) (164.878 242.899 106.257) (171.578 221.549 101.145) (178.817 198.952 101.696) (186.007 176.286 102.897) (192.557 154.095 104.319) (191.341 132.933 102.500) (159.324 262.036 114.489) (147.683 252.928 109.743) (142.111 232.567 105.030) (151.193 209.795 100.863) (160.463 186.318 98.751) (169.390 163.156 97.382) (177.457 141.252 96.924) (172.529 129.088 98.047) (165.095 146.289 98.761) (155.429 169.761 100.321) (145.163 194.366 102.781) (134.813 218.814 105.983) (124.887 241.373 112.746) (115.932 260.565 121.039) (109.996 241.818 119.556) (120.270 221.286 111.719) (131.002 198.100 106.516) (141.817 174.008 102.930) (152.343 150.337 100.258) (162.230 128.369 98.760) (160.981 114.926 97.683) (149.770 131.893 98.662) (139.007 154.257 101.776) (127.937 177.594 106.119) (116.761 200.720 111.263) (105.668 222.123 118.729) (84.476 229.970 128.232) (86.329 201.978 120.898) (101.851 202.030 116.291) (104.356 171.573 110.850) (110.269 160.843 108.148) (122.011 139.311 103.400) (133.694 118.449 99.885) (145.386 100.825 98.046) (131.700 98.445 100.217) (119.510 121.967 102.855) (136.209 135.679 100.425) (107.406 142.350 106.768) (95.226 162.809 111.760) (82.834 182.555 117.777) (70.107 200.654 124.910) (74.028 219.401 128.642) (53.139 198.237 128.582) (49.695 179.781 124.721) (66.612 181.718 121.429) (70.129 154.294 115.697) (83.388 136.275 111.165) (96.505 117.955 107.528) (109.602 100.336 104.789) (123.860 83.493 102.695) (108.510 85.160 105.805) (94.972 102.330 107.748) (80.299 120.882 110.578) (67.467 136.623 113.921) (53.483 153.237 118.530) (32.264 177.067 128.000) (235.681 132.933 104.717) Et normalement à la fin il faut enlever ce qui reste du premier triangle
  16. Pour ceux qui savent résoudre rien qu'en lisant ce nouveau défit, je leurs demande de bien vouloir patienter jusqu'à Lundi soir avant de donner leur solution afin de permettre aux autres de rechercher. Je pense qu'il est d'un niveau intermédiaire J'ai une liste qui se compose de cette manière (setq lst '(1 2 3 5 7 10 11 12 14 20 30 31 33 37 39 40 44 76 80)) J'aimerai un liste qui ne contienne que les chiffres pair @+
  17. Allez, un peu de géométrie. Il s'agit de faire une routine qui évalue si deux droites, définies respectivement par les points p1, p2 et p3, p4 sont parallèles. Exemple : (parallel-p p1 p2 p3 p4) retourne T si p1 p2 est parallèle à p3 p4 PS : p1 p2 p3 p4 sont des points 3d, bien sûr.
  18. bonsoir, Vue l'heure un pas trop difficile soit une liste très longue ayant cette structure (x1 y1 z1 x2 y2 z2 x3 y3 z3........xn yn zn) comment en faire (élégamment et sans utiliser Reverse) une liste de 3 listes ((x1 x2 x3 x4......xn) (y1 y2 y3 ....yn) (z1 z2 z3 ....zn)) A demain
  19. Bonjour Je reprends une idée que je trouve sympa sur un site Anglais C'est de trouver une astuce de programmation pour résoudre un problème et qui nous aidera dans nos futurs lisps Donc je commence le premier en esperant que d'autres suivront ;) J'ai une liste qui se compose de cette manière (setq lst '(("a" "c") ("b" "b") ("b" "a") ("a" "a") ("d" "c") ("d" "e") ("c" "c") ("b" "e") ("b" "e"))) Je souhaite tout simplement la mettre dans l'ordre (("a" "a") ("a" "c") ("b" "a") ("b" "b") ("b" "e") ("b" "e") ("c" "c") ("d" "c") ("d" "e")) @+
  20. La notion de bulge est un moyen très efficient pour conserver l'information concernant la courbure d'un segment de polyligne avec un seul nombre (notamment dans le DXF), mais du coup, c'est moins pratique pour faire directement des calculs. D'un autre côté, les fonctions vlax-curve exposent à l'environnement Visual LISP (pas d'équivalent en VBA ou en AutoLISP sur MAC) une petite partie d'une API ObjectARX et .NET qui définit des objets purement géométriques (sans représentation graphique) utilisés pour les calculs géométriques, celle concernant les objets curvilignes. C'est aussi dans cet environnement que la notion de "paramètre" pour les objets curvilignes est définie (à ma connaissance, elle n'existe dans les données DXF des entités que pour les ellipses, CF un récent challenge). J'avais essayé, il y a quelques temps maintenant de démarrer un sujet sur les paramètres des objets curvilignes. En .NET la classe Curve2d (il y a un équivalent Curve3d) est la classe de base pour, entre autres, les classes CompositeCurve2d, CircularArc2d et LinearEntity2d, cette dernière étant la classe de base pour LineSegment2d. Dans cet environnement, une polyligne correspond à un CompositeCurve2d qui est une succession de LineSegment2d ou de CircularArc2d jointifs. Avec .NET on récupère directement l'objet géométrique correspondant à un segment de polyligne en arc via la méthode GetArcSegment2dAt(index) et on accède ainsi directement à toutes ses propriétés.
  21. Curlygoth

    Nouveau Site Perso

    Beaucoup, Beaucoup de lispeur m'ont dit que le vba n’était pas efficient... par rapport au lisp ! Maintennant, que j'entends l'inverse je vais vous dire le fond de ma pensé : Personnellement pour des taches "simple" sans de boucle le VBA est peut être plus rapide... mais soyons honnête : quand vous faites des outils (genre quickhull que j'avoue n'ai pas commencé XD/ Le challenge à luna) ou autre programme plus lourd (genre tourné tous les blocs d'un certain angle) le lisp est plus rapide ! Note perso : sachez que je suis les conversation lisp car je les combine avec du VBA et c'est juste génialissime !
  22. Coucou, C'était le but premier du challenge au final ^^" J'ai fait quelques tests dont voici les résultats : ;; BENCHMARK D'UNE LWPOLYLINE DE 10 SOMMETS Elapsed milliseconds / relative speed for 8192 iteration(s): (GET-PT-LIST-BRUNO NAME).....................1466 / 3.55 <fastest> (GET-PT-LIST-CURVE NAME).....................1560 / 3.34 (VLAX-CURVE-GETPOLYLINECOORDINATES N...).....1701 / 3.06 (VGETPOINT VNAME)............................1701 / 3.06 (GET-PT-LIST-RECURSIVE-MEMBER NAME)..........1747 / 2.98 (POLYPOINTS NAME)............................1763 / 2.96 (GET-PT-LIST-MEMBER NAME)....................1778 / 2.93 (GET-PT-LIST-NTH-RECURSIVE NAME).............1825 / 2.85 (GET-PT-LIST-RECURSIVE-COORDINATES V...).....1825 / 2.85 (GET-PT-LIST-REPEAT NAME)....................1919 / 2.71 (GET-PT-LIST-MAPCAR NAME)....................3183 / 1.64 (GET-PT-LIST-REMOVE NAME)....................3557 / 1.46 (GET-PT-LIST-SEARCH NAME)....................3572 / 1.46 (GET-PT-LIST-FOREACH NAME)...................3635 / 1.43 (GET-PT-LIST-BONUSCAD NAME)..................5101 / 1.02 (GET-PT-LIST-BRUNO VNAME)....................5210 / 1.00 <slowest> ;; BENCHMARK D'UNE LWPOLYLINE DE 100 SOMMETS Elapsed milliseconds / relative speed for 2048 iteration(s): (VGETPOINT VNAME)............................1107 / 5.19 <fastest> (GET-PT-LIST-BRUNO NAME).....................1217 / 4.72 (GET-PT-LIST-RECURSIVE-COORDINATES V...).....1232 / 4.66 (GET-PT-LIST-CURVE NAME).....................1389 / 4.13 (VLAX-CURVE-GETPOLYLINECOORDINATES N...).....1482 / 3.87 (GET-PT-LIST-MEMBER NAME)....................1498 / 3.83 (GET-PT-LIST-RECURSIVE-MEMBER NAME)..........1498 / 3.83 (POLYPOINTS NAME)............................1607 / 3.57 (GET-PT-LIST-NTH-RECURSIVE NAME).............1809 / 3.17 (GET-PT-LIST-REPEAT NAME)....................1825 / 3.15 (GET-PT-LIST-REMOVE NAME)....................2028 / 2.83 (GET-PT-LIST-MAPCAR NAME)....................2808 / 2.04 (GET-PT-LIST-FOREACH NAME)...................3790 / 1.51 (GET-PT-LIST-BRUNO VNAME)....................3868 / 1.48 (GET-PT-LIST-SEARCH NAME)....................4009 / 1.43 (GET-PT-LIST-BONUSCAD NAME)..................5741 / 1.00 <slowest> ;; BENCHMARK D'UNE LWPOLYLINE DE 1 000 SOMMETS Elapsed milliseconds / relative speed for 128 iteration(s): (GET-PT-LIST-RECURSIVE-COORDINATES V...)......1045 / 14.48 <fastest> (VGETPOINT VNAME).............................1061 / 14.26 (GET-PT-LIST-BRUNO NAME)......................1077 / 14.05 (VLAX-CURVE-GETPOLYLINECOORDINATES N...)......1248 / 12.13 (GET-PT-LIST-CURVE NAME)......................1295 / 11.68 (GET-PT-LIST-RECURSIVE-MEMBER NAME)...........1388 / 10.90 (GET-PT-LIST-MEMBER NAME).....................1435 / 10.54 (POLYPOINTS NAME).............................1513 / 10.00 (GET-PT-LIST-REMOVE NAME).....................1560 / 9.70 (GET-PT-LIST-REPEAT NAME).....................1654 / 9.15 (GET-PT-LIST-MAPCAR NAME).....................2684 / 5.64 (GET-PT-LIST-BRUNO VNAME).....................2730 / 5.54 (GET-PT-LIST-NTH-RECURSIVE NAME)..............3074 / 4.92 (GET-PT-LIST-FOREACH NAME)....................4290 / 3.53 (GET-PT-LIST-SEARCH NAME).....................4446 / 3.40 (GET-PT-LIST-BONUSCAD NAME)..................15132 / 1.00 <slowest> ;; BENCHMARK D'UNE LWPOLYLINE DE 10 000 SOMMETS Elapsed milliseconds / relative speed for 32 iteration(s): (VGETPOINT VNAME)..............................1372 / 230.03 <fastest> (GET-PT-LIST-RECURSIVE-COORDINATES V...).......1420 / 222.26 (GET-PT-LIST-BRUNO NAME).......................1591 / 198.37 (VLAX-CURVE-GETPOLYLINECOORDINATES N...).......1887 / 167.25 (GET-PT-LIST-CURVE NAME).......................1903 / 165.85 (POLYPOINTS NAME)..............................2138 / 147.62 (GET-PT-LIST-MEMBER NAME)......................2152 / 146.66 (GET-PT-LIST-RECURSIVE-MEMBER NAME)............2200 / 143.46 (GET-PT-LIST-REMOVE NAME)......................2464 / 128.09 (GET-PT-LIST-REPEAT NAME)......................2605 / 121.15 (GET-PT-LIST-MAPCAR NAME)......................3884 / 81.26 (GET-PT-LIST-FOREACH NAME).....................5429 / 58.13 (GET-PT-LIST-BRUNO VNAME)......................5679 / 55.57 (GET-PT-LIST-SEARCH NAME)......................5819 / 54.24 (GET-PT-LIST-NTH-RECURSIVE NAME)..............42682 / 7.39 (GET-PT-LIST-BONUSCAD NAME)..................315606 / 1.00 <slowest> Le plus étonnant c'est la différence d'efficacité entre l'utilisation de l'ename ou du VLA-Object sur les fonctions (vlax-curve-*) ! °o° Les durées pour la fonction proposée par BonusCAD me semble quelque peu exagéré mais bon... A savoir que les fonctions (vgetpoint) et (get-pt-list-recursive-coordinates) sont strictement les mêmes, pour le coup @Fraid on a pensé à la même chose ^^" La fonction (get-pt-list-recursive-member) correspond à la fonction (massoc) utilisant la fonction (member), à savoir que j'utilise personnellement la fonction (get-pt-list-member) qui correspond à la version itérative de (massoc) :3 Evidemment, les fonctions qui vérifie chaque paire DXF au lieu de "sauter" les paires inutiles semblent plus lentes (plus de passage dans la boucle ?). Les fonctions (vlax-curve-*) semblent plus rapides que la gestion de la liste DXF de l'entité et la propriété 'Coordinates semble également un peu plus rapide que les fonctions (vlax-curve-*), bien que se soit dommage que les coordonnées ne soient pas ranger 2 à 2 directement (cela éviterait la boucle et donc il existerait une fonction existante capable de renvoyer les coordonnées d'une polyligne directement). Voici les différentes versions que j'avais essayé au fil du temps (la fonction (get-pt-list-curve) est très récente, merci @Olivier Eckmann pour m'avoir appris la signification des paramètres pour les (vlax-curve-*) ! ♥) : (defun get-pt-list-curve (name / pt-list n) (repeat (fix (setq n (1+ (vlax-curve-getEndParam name)))) (setq pt-list (cons (vlax-curve-getPointAtParam name (setq n (1- n))) pt-list ) ) ) pt-list ) (defun get-pt-list-member (name / pt-list entlist) (setq entlist (entget name)) (while (setq entlist (member (assoc 10 entlist) entlist)) (setq pt-list (cons (cdar entlist) pt-list) entlist (cdr entlist) ) ) (reverse pt-list) ) (defun get-pt-list-recursive-member (name / f entlist) (defun f (entlist) (if (setq entlist (member (assoc 10 entlist) entlist)) (cons (cdar entlist) (f (cdr entlist))) ) ) (f (entget name)) ) (defun get-pt-list-search (name / pt-list entlist) (setq entlist (entget name)) (while entlist (if (= (caar entlist) 10) (setq pt-list (cons (cdar entlist) pt-list)) ) (setq entlist (cdr entlist)) ) (reverse pt-list) ) (defun get-pt-list-repeat (name / pt-list entlist) (repeat (cdr (assoc 90 (setq entlist (entget name)))) (setq entlist (member (assoc 10 entlist) entlist) pt-list (cons (cdar entlist) pt-list) entlist (cdr entlist) ) ) (reverse pt-list) ) (defun get-pt-list-remove (name / pt-list) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget name) ) ) ) (defun get-pt-list-mapcar (name / pt-list) (vl-remove nil (mapcar '(lambda (x) (if (= (car x) 10) (cdr x)) ) (entget name) ) ) ) (defun get-pt-list-nth-recursive (name / f) (defun f (lst i / x) (if (= (car (setq x (nth i lst))) 10) (cons (cdr x) (f lst (+ i 5))) ) ) (setq entlist (entget name)) (f entlist (vl-position (assoc 10 entlist) entlist)) ) (defun get-pt-list-recursive-coordinates (vname / f) (defun f (lst) (if lst (cons (list (car lst) (cadr lst)) (f (cddr lst))) ) ) (f (vlax-get vname 'coordinates)) ) Bisous, Luna
  23. Pour essayer de revenir au challenge (et avant de digresser moi aussi) je dévoile différentes implémentations de la routine générique massoc (pour multiple assoc) qui permet de récupérer toutes les entrées d'un même groupe de code dans une liste DXF. Ma réponse en "pur AutoLISP" utiliserait l'implémentation que je préfère : (defun massoc (key alst) (if (setq alst (member (assoc key alst) alst)) (cons (cdar alst) (massoc key (cdr alst))) ) ) (defun polyPoints (pl) (massoc 10 (entget pl)) ) Pour récupérer les sommets de la polyligne en coordonnées SCG (fonctionne aussi avec le polylignes 2d et 3d) : (defun vlax-curve-getPolylineCoordinates (pl / i pts) (repeat (setq i (if (vlax-curve-isClosed pl) (fix (vlax-curve-getEndParam pl)) (1+ (fix (vlax-curve-getEndParam pl))) ) ) (setq pts (cons (vlax-curve-getPointAtParam pl (setq i (1- i))) pts)) ) )
  24. Bonjour, Oui je connais ces messages, pour cette raison j'ai mauvaise conscience à proposer la moindre ligne de code sur ce challenge.
  25. La fonction qui répond au challenge : private static Point2d[] GetPlinePoints(ObjectId id) { using (var tr = new OpenCloseTransaction()) { var pline = (Polyline)tr.GetObject(id, OpenMode.ForRead); var result = new Point2d[pline.NumberOfVertices]; for (int i = 0; i < result.Length; i++) { result[i] = pline.GetPoint2dAt(i); } return result; } } Une commande de test pour sélectionner la polyligne et choisir le nombre d'itération pour le 'benchmark'. [CommandMethod("TEST")] public static void Test() { var doc = AcAp.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; var entOpts = new PromptEntityOptions("\nSélectionnez une polyligne: "); entOpts.SetRejectMessage("\nL'objet séléctionné n'est pas une polyligne."); entOpts.AddAllowedClass(typeof(Polyline), true); var entRes = ed.GetEntity(entOpts); if (entRes.Status != PromptStatus.OK) return; var id = entRes.ObjectId; var kwOpts = new PromptKeywordOptions("\nChoisissez le nombre d'itérations [64/512/4096/32768]: ", "64 512 4096 32768"); var kwRes = ed.GetKeywords(kwOpts); if (kwRes.Status != PromptStatus.OK) return; int nb = int.Parse(kwRes.StringResult); var sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i < nb; i++) { GetPlinePoints(id); } sw.Stop(); ed.WriteMessage($"\nElapsed milliseconds {sw.ElapsedMilliseconds} for {nb} iterations"); } Attaché, un ZIP à débloquer contenant la DLL à charger dans AutoCAD avec NETLOAD. GetPointListChallenge.zip
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité